-
同步 : 1 等待该任务执行完毕之后再继续向下执行。 2 不开启新的线程,在原来的线程执行。
-
异步 : 将该任务提交到队列。继续向下执行。不等待任务执行完毕。可以开启新的线程来执行任务,由系统来调度
-
串行队列 :只会有一条线程来执行这个队列的任务。
-
并发队列 :可以将队列里的任务逐个交给多个线程去同时执行。
既然是队列,任务就会按顺序被取出来然后由线程去执行。
并发队列是可以将任务1取出来交给线程1去执行,然后将任务2取出来交给线程2去执行。这样可以多个线程同时执行多个任务。达到并发的效果。当然这需要任务是异步执行的,否则会等待第一个任务执行完之后再执行。
而串行队列是只能取出来一个任务交给一个线程执行,等这个线程执行完了这个任务再取一个任务交给这个线程去执行。不会有多个线程来取这个队列的任务。同步则是在当前线程执行,异步则是开一条新的线程来执行。
同步操作在各队列下的情况
dispatch_sync(queue,block)
同步 + 主队列 = 死锁
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_sync(dispatch_get_main_queue(), ^{
// do something
});
}
同步主队列
同步 + 串行队列
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
// do somethings
});
}
执行到这里,主线程将该任务提交到串行队列中
由于是同步方法,所以主线程会等待这个任务执行完毕再向下执行。
并且因为是同步方法,所以这个任务不会开新的线程来执行,还是由原来的线程执行。
也就是说主线程等这个串行队列中前面的任务执行完毕之后,执行这个任务。执行了这个任务之后向下继续执行。
这种操作没有太大的必要。
图示
同步串行队列同步 + 并发队列
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
// do somethings
});
}
相比于同步串行队列,该任务等待时间会短一点,因为是并发队列,前面的任务会被其他线程去执行。其他的基本相同
图示
同步并发队列执行异步操作在各队列下的情况
dispatch_async(queue,block)
异步 + 主队列
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
// do something
});
}
将任务添加到主队列的最后。
图示
异步主队列执行图异步 + 串行队列
将任务提交到指定的串行队列。
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
// do something
});
}
因为是异步的,所以主线程将任务提交到这个串行队列之后就可以继续执行。不会卡住主线程。
同样因为是异步的,所以会开启一条子线程来执行这个串行队列中的任务。
因为是串行队列,所以只有一条线程来执行这个队列中的任务。那么该任务就得等前面的任务被该线程执行完了才能被执行。
图示
异步串行队列图示异步 + 并发队列
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// do something
});
}
将任务提交到并发队列,因为是异步的,所以不会阻塞主线程,主线程将任务提交到队列之后继续从向下执行。
因为是在并发队列,所以该任务不用等前面的任务完成之后再执行,只要前面的任务被线程开始执行了,接下来就会将该任务分配给一条线程去执行。
异步并行队列图示
网友评论