iOS GCD NSOperation NSThread等多线程各种举例详解

  废话就不多说,直接上干货。如下图列举了很多多线程的知识点,每个按钮都写有对应的详细例子,并对运行结果进行分析,绝对拿实践结果来说话。如果各位道友发现错误之处还请指正。附上demo下载地址

 

  iOS中几种多线程的比较

  GCD:是苹果为多核的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核(比如双核、四核),最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理。

  NSOperation:是苹果公司对GCD的封装,以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation 和 NSOperationQueue 分别对应 GCD 的 任务 和 队列 。

  NSThread:是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销。

一、iOS多线程之GCD篇

    下面将以实际例子讲解串行队列、并行队列、主队列、全局队列、同步、异步、队列组、dispatch_barrier_async等的使用方法,以及分析死锁原因等。

  1.串行队列异步执行(不阻塞当前线程,且都是按顺序执行,前一个完成,后一个才开始,异步操作会另开辟线程

  举个例子

//串行队列异步执行
- (IBAction)serialAsync:(id)sender {
    // 创建一个串行队列
    //其中第一个参数是标识符。第二个参数传DISPATCH_QUEUE_SERIAL 或 NULL 表示创建串行队列,传入 DISPATCH_QUEUE_CONCURRENT 表示创建并行队列。
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);
    //通过一个for循环将3个很耗时的异步任务加到myQueue队列
    for (NSInteger n = 0; n < 3; n++) {
     //异步执行 dispatch_async(myQueue,
^{ //模拟一个很耗时的操作 for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"串行异步任务%ld -> 开始%@",n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"串行异步任务%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我没有?当前线程%@",[NSThread currentThread]); }

 

打印结果:

 

分析结论:“阻塞我没?”这句在第一行就打印了,说明串行异步操作不阻塞当前线程,且都是按顺序执行,前一个完成,后一个才开始。异步操作会另开辟线程。

  2.串行队列同步执行(会阻塞当前线程,且都是按顺序执行,前一个完成,后一个才开始,同步操作不会开辟线程

  举个例子

//串行队列同步执行
- (IBAction)serialSync:(id)sender {
    // 创建一个串行队列
    //其中第一个参数是标识符。第二个参数传DISPATCH_QUEUE_SERIAL 或 NULL 表示创建串行队列,传入 DISPATCH_QUEUE_CONCURRENT 表示创建并行队列。
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);
    //通过一个for循环将3个很耗时的同步任务加到myQueue队列
    for (NSInteger n = 0; n < 3; n++) {
     // 同步执行 dispatch_sync(myQueue,
^{ //模拟一个很耗时的操作 for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"串行同步任务%ld -> 开始%@",n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"串行同步任务%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我没有?当前线程%@",[NSThread currentThread]); }

打印结果:

分析结论:“阻塞我没?”这句到最后才执行,说明串行队列同步任务会阻塞当前线程,且都是按顺序执行,前一个完成,后一个才开始。从打印结果看,全在主线程执行的,所以同步操作不会开辟线程。

  3.并行队列异步执行(不阻塞当前线程,多个任务同时开始,异步操作会另开辟线程

  举个例子

//并行队列异步执行
- (IBAction)concurrentAsync:(id)sender {
    // 创建一个并行队列
    //其中第一个参数是标识符。第二个参数传DISPATCH_QUEUE_SERIAL 或 NULL 表示创建串行队列,传入 DISPATCH_QUEUE_CONCURRENT 表示创建并行队列。
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    //通过一个for循环将3个很耗时的异步任务加到myQueue队列
    for (NSInteger n = 0; n < 3; n++) {
     // 异步执行 dispatch_async(myQueue,
^{ //模拟一个很耗时的操作 for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"并行异步任务%ld -> 开始%@",n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"并行异步任务%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我没有?当前线程%@",[NSThread currentThread]); }

打印结果:

分析结论:不阻塞当前线程,红圈的时间显示,并行队列异步多个任务同时开始。异步操作会另开辟线程。

  4.并行队列同步执行(会阻塞当前线程,且都是按顺序执行,前一个完成,后一个才开始。)

  举个例子

//并行队列同步执行
- (IBAction)concurrentSync:(id)sender {
    // 创建一个并行队列
    //其中第一个参数是标识符。第二个参数传DISPATCH_QUEUE_SERIAL 或 NULL 表示创建串行队列,传入 DISPATCH_QUEUE_CONCURRENT 表示创建并行队列。
    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    //通过一个for循环将3个很耗时的同步任务加到myQueue队列
    for (NSInteger n = 0; n < 3; n++) {
     // 同步执行 dispatch_sync(myQueue,
^{ //模拟一个很耗时的操作 for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"并行同步任务%ld -> 开始%@",(long)n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"并行同步任务%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我没有?当前线程%@",[NSThread currentThread]); }

打印结果:

你可能感兴趣的:(iOS GCD NSOperation NSThread等多线程各种举例详解)