结论:
只要是异步添加任务,不管是并行队列还是串行队列,任务都是在新线程中执行;但在主队列里时不开启新线程;
只要是同步添加任务,不管是并行队列还是串行队列,任务都是在当前线程执行;
同步与异步只是要不要阻塞当前线程;
----------------------------------------------------------------------------------
队列用来管理任务被执行的线程,遵循FIFO原则(先进先出),FIFO原则用来理解同步死锁时非常重要;
队列分串行和并行两种;
将任务加入队列有同步和异步两种方式,同步是会阻塞当前线程,异步不阻塞当前线程;
异步执行肯定不会导致死锁;
只有一种情况会死锁:同一个串行队列Q里往该队列Q同步添加任务,会死锁。
不管是同步还是异步,将任务添加进队列都是按照FIFO添加到后面,但在并行队列中,不确定谁先执行完;
队列死锁:相对于线程死锁,队列死锁的概念也是存在的(队列根据一些锁来保证线程执行任务时的顺序,出现线程锁,应该本质还是线程锁),在同步串行队列中,如果当前队列与同步的任务队列是同一个,当同步添加任务后,将任务添加到主队列的最后面,并且阻塞主线程,等待任务2执行,但根据队列的FIFO原则,click方法(任务)还没执行完,并且在任务2之前,这样click等待任务2执行完,而任务2又等待click方法执行完,就造成了死锁。
有一些半桶水资料,将死锁解释为任务3排在任务2前面,这是因为不懂而乱说。
同步+串行队列:在当前线程执行(没必要新建线程),如果当前队列是任务所在的队列,会造成队列死锁;
这个执行顺序是:1,isMain:1,2,3;
click在主队列中,跟concurrentQueue不是同一个队列,所以不会死锁。
同步+并行队列:在当前线程执行(没必要新建线程),如下所示
异步+并行队列:在新线程中执行任务
异步+串行队列:
由此可见:
只要是异步添加任务,不管是并行队列还是串行队列,任务都是在新线程中执行;但在主队列里时不开启新线程;
只要是同步添加任务,不管是并行队列还是串行队列,任务都是在当前线程执行;
同步与异步只是要不要阻塞当前线程;
因为同步会阻塞,所以同步+并行队列结果也成为了一个串行,因为sync会获得本次任务的结果才会执行下次结果,就会体现不出并发性。
异步+并行队列:根据GCD线程池情况而定,如果线程数小于任务数,可能某个任务要等其他任务完成再获得线程来执行。