任务执行的类型分为以下两种:
1.1同步执行任务:在当前线程执行任务。不会开辟新的线程。
1.2异步执行任务:在其他线程执行任务,会开辟新的线程。
队列的类型分为以下两种:
2.1串行队列:队列里的任务执行模式为一个接一个,一次只会取出一个任务。
2.2并发队列:同时执行多个任务,一次拿出所有任务。
代码如下:
- (void)test2{ // 创建并行队列 //参数中,DISPATCH_QUEUE_CONCURRENT表示当前队列为并行队列,要同时执行 dispatch_queue_t queue = dispatch_queue_create("zzz", DISPATCH_QUEUE_CONCURRENT); // 同步执行任务 for (int i = 0 ;i < 10; i ++) { dispatch_sync(queue, ^{ NSLog(@"当前操作咋%@线程 --- 任务号 = %d",[NSThread currentThread],i); }); } }代码如下:
- (void)test3{ // 创建串行队列 dispatch_queue_t queue = dispatch_queue_create("zz", NULL); // 异步执行任务 即要开辟新的线程去执行 for (int i = 0 ;i < 10; i ++) { dispatch_async(queue, ^{ NSLog(@"当前操作咋%@线程 --- 任务号 = %d",[NSThread currentThread],i); }); } }打印结果中的一部分:
16-01-17 21:22:53.890 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 2
2016-01-17 21:22:53.890 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 3
2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 4
2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 5
2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 6
2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 7
2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 8
2016-01-17 21:22:53.892 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 --- 任务号 = 9
代码如下:
- (void)test4{ // 创建并行队列 dispatch_queue_t queue = dispatch_queue_create("zz", DISPATCH_QUEUE_CONCURRENT); // 异步执行任务 for (int i = 0 ;i < 10; i ++) { dispatch_async(queue, ^{ NSLog(@"当前操作咋%@线程 --- 任务号 = %d",[NSThread currentThread],i); }); } }
打印结果:
2016-01-17 21:26:24.370 wdqdqw[14380:1207071] 当前操作咋<NSThread: 0x7fc402c11940>{number = 2, name = (null)}线程 --- 任务号 = 0
2016-01-17 21:26:24.370 wdqdqw[14380:1207070] 当前操作咋<NSThread: 0x7fc402f08900>{number = 3, name = (null)}线程 --- 任务号 = 1
2016-01-17 21:26:24.370 wdqdqw[14380:1207081] 当前操作咋<NSThread: 0x7fc402d032a0>{number = 5, name = (null)}线程 --- 任务号 = 3
2016-01-17 21:26:24.370 wdqdqw[14380:1207082] 当前操作咋<NSThread: 0x7fc402f0a200>{number = 6, name = (null)}线程 --- 任务号 = 4
2016-01-17 21:26:24.370 wdqdqw[14380:1207067] 当前操作咋<NSThread: 0x7fc402c064b0>{number = 4, name = (null)}线程 --- 任务号 = 2
2016-01-17 21:26:24.370 wdqdqw[14380:1207083] 当前操作咋<NSThread: 0x7fc402da07e0>{number = 7, name = (null)}线程 --- 任务号 = 5
2016-01-17 21:26:24.371 wdqdqw[14380:1207071] 当前操作咋<NSThread: 0x7fc402c11940>{number = 2, name = (null)}线程 --- 任务号 = 6
2016-01-17 21:26:24.371 wdqdqw[14380:1207070] 当前操作咋<NSThread: 0x7fc402f08900>{number = 3, name = (null)}线程 --- 任务号 = 7
2016-01-17 21:26:24.371 wdqdqw[14380:1207081] 当前操作咋<NSThread: 0x7fc402d032a0>{number = 5, name = (null)}线程 --- 任务号 = 8
2016-01-17 21:26:24.371 wdqdqw[14380:1207082] 当前操作咋<NSThread: 0x7fc402f0a200>{number = 6, name = (null)}线程 --- 任务号 = 9
根据上面结果可以看到,任务与队列完全不是一种东西,队列有队列的属性,任务也有任务的属性。
但是他们彼此直接也有一定的联系,即队列不过就是任务的排列形式。
如果把任务和队列都看成对象,那么任务们只知道自己应该在哪个线程中执行和自己应该如何去执行。这是它的属性。即任务本身是个代码块,它有同步与异步之分!!
而队列只知道自己有哪些任务要做和应该怎么去执行任务(同时去执行呢还是一个一个去执行?)。它不知道任务要去干吗,它也不知道要去哪个线程执行。
也就是说,队列把任务们一个一个或者一次性全部的放出去,然后就无作为了。而任务们会去根据自己的属性,去寻找当前线程或者新的线程去执行自己的代码块!
转载于:https://www.cnblogs.com/BJTUzhengli/p/5137863.html
相关资源:JAVA上百实例源码以及开源项目