iOS中的多线程及GCD

多线程中的一些概念

    //任务:代码段  方法  线程就是执行这些任务

    //NSThread类 创建线程 执行线程

[NSThread isMainThread]//判断是否是主线程

#import "AppDelegate.h"

@implementation AppDelegate
-(void)dealloc
{
    [_window release];
    [super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    //实现多线程
    //任务:代码段  方法  线程就是执行这些任务
    //NSThread类 创建线程 执行线程
    NSLog(@"-------------%d",[NSThread isMainThread]);//判断是否是主线程
    
    //实现多线程的方式一
    //使用 根类 NSObject 中的 performSelectorxxx方法
    //UI的刷新一定要在主线程里进行  子线程刷新UI会异常  刷新不了   或者延迟刷新.
//    [self performSelectorInBackground:@selector(aa) withObject:nil];
    
    //实现多线程的方式二
    //使用 NSThread 类(多线程类)
    //创建一个线程 ,并让线程执行 self 的aa方法
    
    //线程分两种  脱离线程 和 非脱离线程
    //脱离线程;执行玩任务之后,自动销毁的线程
    //非脱离线程 : 执行完任务之后 ,不会被销毁的线程,可以后续执行别的任务
    //每一个线程都自带一个NSRunLoop对象,runloop默认是关闭的.一旦runloop开启,你的线程就会成为非脱离线程.runloop帮你轮询有没有新的任务分配到了这个线程里面
    
    //[NSThread detachNewThreadSelector:@selector(aa) toTarget:self withObject:nil];
    
    //创建一个线程,线程需要执行的任务是self 的aa 方法
//    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(aa) object:nil];
//    [thread start];//开始执行线程   解决了延迟执行的问题  在想执行的时候执行
    
    //第三种实现多线程的方式NSOperationQueue
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(aa) object:nil];
//    [op1 start];
    
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"这是一个block operation");
    }];
    //线程同步就是串行  线程之间有依赖关系的时候使用同步 实现同步就把NSOperationQueue的MaxConcurrentOperationCount最大并发数为1
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//    NSLog(@"~~~~~~~~~~~~~~~~~~~~~~~~%d",queue.maxConcurrentOperationCount);
    [queue setMaxConcurrentOperationCount:1];//设置最大并发数为1
    [queue addOperation:op1];//只需要把操作放到队列里即可,不需要人为调用start,queue会根据op的排队情况,帮你调用start .会智能帮为op安排线程
    [queue addOperation:op2];
    
    
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)aa
{
    //如果在子线程中执行任务 我们需要在任务里面加一个自动释放池
    //因为.线程与线程之间是相互独立的,但是资源是共享的,共享堆 空间 ,如果一个线程开辟了空间  没有释放  其他线程也无法 使用这块已经开辟的空间
    //尤其是当子线程里  大量使用便利构造器的时候 会导致很多堆空间无法回收内存
    //线程共享堆  ,栈不共享  每个子线程默认以栈的大小是512k  主线程栈大小事1M 栈主要是放 局部变量的,局部变量出了方法就会被销毁,因此,尽管只有512k或着1M但是已经够用的了 ,,栈空间的大小必须是4k的整数倍
    //
    @autoreleasepool {
        for (int i = 0; i<10; i++) {
            NSLog(@"%d",i);
        }
        NSLog(@"#################%d",[NSThread isMainThread]);
        
        [self performSelectorOnMainThread:@selector(bb) withObject:nil waitUntilDone:YES];
        NSLog(@"子线程结束了");
    }

}
- (void)bb
{
    @autoreleasepool {
        NSLog(@"??????????????????????%d",[NSThread isMainThread]);
        for (int i = 0; i<20; i++) {
            NSLog(@"-%d",i);
        }
        NSLog(@"刷新你的UI");
    }

}

 

iOS中的多线程及GCD,布布扣,bubuko.com

iOS中的多线程及GCD

上一篇:Android学习路线(六)为Android应用添加ActionBar


下一篇:BIP Requests Are Failing With Error "OPP Error Oracle.apps.xdo.XDOException: Error Creating Lock Fil