线程, 任务,和队列的概念
-------------------
线程: 程序执行任务的最小调度单位.
任务: 就是一段代码, 在 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---");
}