美文网首页
iOS -- GCD基础理解 ( 24)

iOS -- GCD基础理解 ( 24)

作者: dingzhijie | 来源:发表于2017-10-16 16:40 被阅读0次

线程, 任务,和队列的概念

-------------------

线程: 程序执行任务的最小调度单位.

任务: 就是一段代码, 在 GCD 中,任务就是 block 中要执行的内容.

队列: 用来存放'任务'的一个数组.

===================

异步.同步,并行.串行的特点

-------------------

异步执行 (调度): 具备开辟新线程的能力, 任务创建后可以先绕行, 回头再执行.

同步执行 (调度): 不具备开辟新线程的能力, 任务创建后就要执行完才能继续往下走.

并行队列: 队列中的任务同时执行.

串行队列: 队列中的任务要按顺序执行.

*/

- (void)viewDidLoad {

[super viewDidLoad];

//[self asyncConcurrent];

//[self asyncSerial];

//[self syncConcurrent];

//[self syncSerial];

//[self asyncMain];

[self asyncGroup];

}

/**

异步分组 + 并发队列

*/

- (void)asyncGroup{

// 创建一个并行队列

dispatch_queue_t queue = dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);

NSLog(@"--start--");

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{

int num = 0;

for (int i = 0;i < 1000; i++) {

num += i;

}

NSLog(@"%d",num);

NSLog(@"任务---%@", [NSThread currentThread]);

});

dispatch_group_notify(group, queue, ^{

NSLog(@"Group 执行结束");

});

NSLog(@"---end---");

}

/**

异步执行 + 主队列

不开辟新的线程, 任务按顺序执行

异步执行意味着:

可以开辟新的线程

任务可以先绕过不执行, 回头再来执行

主队列 和 串行队列的区别:

队列中的任务一样要按照顺序执行

主队列中的任务必须在主线程中执行, 不允许开辟子线程.

两者组合的结果:

所有任务都可以先跳过, 之后再来按顺序执行.

*/

- (void)asyncMain{

// 获取主队列

dispatch_queue_t queue = dispatch_get_main_queue();

NSLog(@"---start---");

//使用异步函数封装三个任务

dispatch_async(queue, ^{

NSLog(@"任务1---%@", [NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"任务2---%@", [NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"任务3---%@", [NSThread currentThread]);

});

NSLog(@"---end---");

}

/**

同步执行 + 串行队列

不开辟新的线程,任务按顺序执行

解释:

这里的执行原理 和 同步执行+并发队列 是一样的, 只要是同步执行就没法开辟新的线程, 所以多个任务之间也是一样按顺序来执行.

*/

- (void)syncSerial{

// 创建一个串行队列

dispatch_queue_t queue = dispatch_queue_create("串行队列2", DISPATCH_QUEUE_SERIAL);

NSLog(@"---start---");

//使用异步函数封装三个任务

dispatch_sync(queue, ^{

NSLog(@"任务1---%@", [NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"任务2---%@", [NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"任务3---%@", [NSThread currentThread]);

});

NSLog(@"---end---");

}

/**

同步执行 + 并行队列

不开辟新的线程,任务按顺序执行

解释:

同步执行意味着:

不能开辟新的线程.

任务创建后必须执行完才能往下走.

并行队列意味着:

任务可以同时执行

两者组合结果:

所有任务都只能在主线程中执行

函数在执行时,必须按照代码的书写顺序执行

注意:

在这里即使是并发多列, 任务可以同时执行,但是由于只存在一个主线程,所以不能把任务分发到不同的线程中去处理,其结果就是只能在主线程里按照顺序挨个执行.

*/

- (void)syncConcurrent{

// 创建一个并行队列

dispatch_queue_t queue = dispatch_queue_create("并行队列2", DISPATCH_QUEUE_CONCURRENT);

NSLog(@"__start__");

// 使用同步函数封装三个任务

dispatch_sync(queue, ^{

NSLog(@"任务1---%@", [NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"任务2---%@", [NSThread currentThread]);

});

dispatch_sync(queue, ^{

NSLog(@"任务3---%@", [NSThread currentThread]);

});

NSLog(@"---end---");

}

/**

异步执行 + 串行队列

开辟一个新的线程,任务按顺序执行

解释:

异步执行意味着:

可以开辟新的线程

任务可以先绕过不执行, 回头再来执行

串行队列意味着:

任务必须按添加进队列的顺序挨个执行

两者组合结果:

开辟了一个新的线程

函数在执行是,先打印了start 和 end ,再回头执行这三个任务.

这三个任务是按顺序执行的.

*/

- (void)asyncSerial{

// 创建一个串行队列

dispatch_queue_t queue = dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);

NSLog(@"__start--");

//使用异步函数封装三个任务

dispatch_async(queue, ^{

NSLog(@"任务1---%@", [NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"任务2---%@", [NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"任务3---%@", [NSThread currentThread]);

});

NSLog(@"---end---");

}

/**

异步执行 + 并行队列

开启多个线程, 任务同时执行

解释:

异步执行意味着

可以开启新的线程,

任务可以先绕过不执行, 回头再来执行.

并行队列意味着

任务之间不需要排队, 且具有同时被执行的 '权利'.

两者组合的结果

开辟了三个线程

函数在执行时,先打印了 start 和 end, 再回头执行这三个任务.

这三个任务是同时执行的.

*/

- (void)asyncConcurrent{

// 创建一个并行队列

dispatch_queue_t queue = dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);

NSLog(@"--start--");

// 使用异步函数封装三个任务

dispatch_async(queue, ^{

NSLog(@"任务1---%@", [NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"任务2---%@", [NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"任务3---%@", [NSThread currentThread]);

});

NSLog(@"---end---");

}

相关文章

网友评论

      本文标题:iOS -- GCD基础理解 ( 24)

      本文链接:https://www.haomeiwen.com/subject/ptfluxtx.html