dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ // NSLog(@"1"); sleep(3); NSLog(@"1"); }); dispatch_sync(serialQueue, ^{ sleep(1); NSLog(@"2"); }); dispatch_async(serialQueue, ^{ NSLog(@"3"); }); dispatch_sync(serialQueue, ^{ sleep(5); NSLog(@"4"); }); dispatch_async(serialQueue, ^{ NSLog(@"5"); });
看看上面的代码,你猜猜会输出什么东东? 反正在今天以前我会认为它输出坑定不是有序的,以前一直认为串行就是一个一个执行,好,第一个是异步,那就异步去吧,第二个同步,同步执行完,去执行第三个,而后..... 同步就执行完,而后执行下一个,异步就不知道何时执行完了。并发
哈哈哈哈,今天我不得不对本身的想法勘称sb。太自觉得是了。从中就能够看出我不能理解串行队列的本质。异步
那么什么是串行队列?什么是并行队列?async
Concurrent: tasks are dequeued in FIFO order, but run concurrently and can finish in any order.函数
Serial: tasks execute one at a time in FIFO order测试
并发: 任务以FIFO从序列中移除,而后并发运行,能够按照任何顺序完成。它会自动开启多个线程同时执行任务spa
串行: 任务以FIFO从序列中一个一个执行。一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)并且只会开启一条线程操作系统
为了再次证明串行队列中只有一个线程执行任务:线程
dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL); for (int i = 0; i< 10;i++){ // 10个异步 dispatch_async(queue, ^{ NSLog(@"%@--%d",[NSThread currentThread], i); }); }
咱们能够发现thread的地址是同样的,那就证明了serial queue只有一个线程执行任务。而后咱们测试一下并发队列code
dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i< 10;i++){ // 10个异步 dispatch_async(queue, ^{ NSLog(@"%@--%d",[NSThread currentThread], i); }); }
由上图能够看出并发队列中是有多个线程执行任务的。blog
比较上面两个程序,咱们仅仅是建立了两个不一样类型的queue,可是结果迥然不一样,并发会开启多个线程,执行的顺序咱们没法控制,至于那个线程执行那个任务由队列决定,哪一个任务先完成由CPU和操做系统决定,而且并发队列中的线程是能够重复利用(线程池),这也是能够理解的,可是下面:
dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i< 10;i++){ // 10个异步 dispatch_sync(queue, ^{ NSLog(@"%@--%d",[NSThread currentThread], i); }); }
发现并发只能在异步函数下有效,name=main ,还不会建立新线程。全部的任务依次在主线程上执行。