iOS多线程复习(只是熟悉而已)

- (void)asyTest{

    // 创建线程

    NSThread *thread = [[NSThread alloc]initWithTarget:self

                                              selector:@selector(test)

                                                object:nil];

    

    [NSThread detachNewThreadSelector:@selector(test)

                             toTarget:self

                           withObject:nil];

    // 获取当期线程

    NSThread *currentThread = [NSThread currentThread];

    // 主线程相关

    NSThread *mainThread = [NSThread mainThread];

    BOOL isMainThread = [mainThread isMainThread];

    // 线程优先级

    CGFloat priority = [currentThread threadPriority];

    [currentThread setThreadPriority:5.0];

    

    while (1) {

        // 使用对象锁,一次只能一个对象访问

        @synchronized(self) {// 只能加一把锁

            [NSThread exit];

            break;

        }

    }

    

    

    // 异步GCD

    // 使用全军并发队列,默认优先级

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // 串行队列

        dispatch_queue_t synQueue = dispatch_queue_create("队列名称",NULL);

        

        dispatch_sync(synQueue, ^{

            

        });

        

        dispatch_async(dispatch_get_main_queue(), ^{

            

        });

        

    });

    

    

    // 组队列

    dispatch_group_t group =  dispatch_group_create();

    

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

        // 执行1个耗时的异步操作

        

    });

    

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

        // 执行1个耗时的异步操作

        

    });

    

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        

        // 等前面的异步操作都执行完毕后,回到主线程...

        

    });

    

    

    // NSOperation

    /**

     NSOperation的作⽤:配合使用NSOperationNSOperationQueue也能实现多线程编程

     

     NSOperationNSOperationQueue实现多线程的具体步骤:

     

     1)先将需要执行的操作封装到一个NSOperation对象中

     

     2)然后将NSOperation对象添加到NSOperationQueue

     

     3)系统会⾃动将NSOperationQueue中的NSOperation取出来

     

     4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏

     

     2.NSOperation的子类

     

     NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类

     

     使用NSOperation⼦类的方式有3种:

     

     1NSInvocationOperation

     

     2NSBlockOperation

     

     3)自定义子类继承NSOperation,实现内部相应的⽅法

     */

    

    //操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue,才会异步执行操作

    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];

    [operation start];

    

    //只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

        

    }];

    // 添加操作

    [blockOperation addExecutionBlock:^{

        

    }];

    [blockOperation start];

    

    /**

     .NSOperationQueue

     

     NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的

     

     如果将NSOperation添加到NSOperationQueue(操作队列),系统会自动异步执行NSOperation中的操作

     

     添加操作到NSOperationQueue中,自动执行操作,自动开启线程

     

     注意:系统自动将NSOperationqueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务是并行执行的。

     

     提示:队列的取出是有顺序的,与打印结果并不矛盾。这就好比,选手A,BC虽然起跑的顺序是先A,B,然后C,但是到达终点的顺序却不一定是A,B在前,C在后。

     */

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    

    [queue addOperation:operation];

    [queue addOperation:blockOperation];

    

    // 第二种

    [queue addOperationWithBlock:^{

        NSLog(@"ddd");

    }];

    /**

     一、并发数

     1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3

     2)最大并发数:同一时间最多只能执行的任务的个数。

     3)最⼤大并发数的相关⽅方法

     - (NSInteger)maxConcurrentOperationCount;

     - (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

     说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。

     注意:num的值并不代表线程的个数,仅仅代表线程的ID

     提示:最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。

     */

    

    [queue cancelAllOperations];

    [queue setSuspended:YES];

    NSLog(@"%d",[queue isSuspended]);

    

    // 暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种情况,就可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。

    [operation addDependency:blockOperation];// 操作operation依赖blockOperation

    // 可以在不同的queue的操作之间建立依赖关系,切记不能循环依赖

    

    // 可以监听一个操作是否完成

    operation.completionBlock = ^{

    

    };

    

    // 把任务添加到队列中,自动执行,自动开启线程

    [queue addOperation:operation];

    

    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值