- dispatch_queue_t queue3 = dispatch_queue_create("myQueue3", DISPATCH_QUEUE_SERIAL);
- dispatch_async(queue3, ^{
- for (int i = 0; i < 10; i++) {
- NSLog(@"执行任务3-----%@", [NSThread currentThread]);
- }
- });
-
- dispatch_async(queue3, ^{
- for (int i = 0; i < 10; i++) {
- NSLog(@"执行任务3-2-----%@", [NSThread currentThread]);
- }
- });
-
- for (int i = 0; i < 10; i++) {
- NSLog(@"执行任务1-----%@", [NSThread currentThread]);
- }
- 2019-02-14 15:48:52.982315+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.982310+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.982607+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.982607+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.982759+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.982759+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.982871+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.982917+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.982970+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.983061+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.983401+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.983668+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.983945+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.984186+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.984453+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.984710+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.984928+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.985130+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.994169+0800 MJ_iOS_Test[6484:189759] 执行任务1-----<NSThread: 0x600000356840>{number = 1, name = main}
- 2019-02-14 15:48:52.994181+0800 MJ_iOS_Test[6484:189815] 执行任务3-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.994355+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.994502+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.994671+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.994804+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.995173+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.995663+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.996280+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.996518+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.996819+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
- 2019-02-14 15:48:52.997497+0800 MJ_iOS_Test[6484:189815] 执行任务3-2-----<NSThread: 0x600000320940>{number = 3, name = (null)}
<1>串行队列queue3中存储两个任务:“执行任务3”和“执行任务3-2”,主队列中存储三个任务:两个A和“执行任务1”;子线程运行queue3的任务,主线程运行主队列中的任务;
<2>“执行任务3”对应的A在主线程运行完毕后自动在主队列中销毁,系统就会从主队列中取出下一个任务即“执行任务3-2”对应的A;同时,“执行任务3”被添加到queue3中并在系统随即开辟的子线程中运行;
- dispatch_queue_t queue2 = dispatch_get_global_queue(0, 0);
- dispatch_async(queue2, ^{
- for (int i = 0; i < 10; i++) {
- NSLog(@"执行任务3-----%@", [NSThread currentThread]);
- }
- });
-
- dispatch_async(queue2, ^{
- for (int i = 0; i < 10; i++) {
- NSLog(@"执行任务3-2-----%@", [NSThread currentThread]);
- }
- });
-
- for (int i = 0; i < 10; i++) {
- NSLog(@"执行任务1-----%@", [NSThread currentThread]);
- }
//打印
- 2019-02-14 16:06:55.818176+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.818227+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.818227+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.818495+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.818500+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.818500+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.818630+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.818657+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.818753+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.818758+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.819027+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.819361+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.819644+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.820062+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.820389+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.820744+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.821125+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.821634+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = 2019-02-14 16:06:55.822389+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- (null)}
- 2019-02-14 16:06:55.821989+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.833276+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.833308+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.833282+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.833419+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.833462+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.833503+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.833543+0800 MJ_iOS_Test[6737:199038] 执行任务1-----<NSThread: 0x600002ed1180>{number = 1, name = main}
- 2019-02-14 16:06:55.833890+0800 MJ_iOS_Test[6737:199118] 执行任务3-----<NSThread: 0x600002eb2380>{number = 3, name = (null)}
- 2019-02-14 16:06:55.834534+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
- 2019-02-14 16:06:55.835481+0800 MJ_iOS_Test[6737:199117] 执行任务3-2-----<NSThread: 0x600002eb23c0>{number = 4, name = (null)}
//分析
<1>此时有三条线程在跑:主线程运行“执行任务1”;number为3的子线程运行“执行任务3”;number为4的子线程运行“执行任务3-2”;
<2>各个线程间:运行各自的任务,互不影响,交替执行;
四、结论
1)A自始存储在主队列中并由主线程来运行;B初始并不必然存储在主队列中,取决于目标队列类型,是否由主线程来运行,取决于系统是否开启新线程;
2)同步:只运行在主线程中,A会在主队列中一直等待B执行完毕;异步:开启新线程,A不会等待;
3)线程阻塞:线程正在运行某个任务,下一个任务只能等待该任务运行完毕才能运行(前提:都运行在同一个线程中);
4)添加B到主队列:同步,死锁;异步:运行在主线程中,不会开启新线程;
5)死锁本质:队列阻塞———添加任务A和被添加任务B都存储在主队列中,因为同步,系统不会开辟新线程,而A运行完毕后也不会从主队列中销毁,造成A等待B,B等待A;
<1>因此,任何一个队列,只要其中前后两个任务相互等待就会造成死锁;而此时对应的线程是闲置的,并没有阻塞;
<2>解决方案:要么两个任务放在不同队列中,要么添加任务(A)执行完毕后使其在队列中销毁(即异步);
6)不同线程间,运行任务互不影响,交替执行;不同队列可共用同一个线程,同一个队列中的不同任务可运行在不同线程上;
7)主线程:number为1,name为main;子线程:number大于1,name自定义;
8)异步:队列性质决定线程性质(主线程还是子线程)及运行顺序——见“6)异步并行”;
说明:代码较为简单,主要是理论,就不上传GitHub了;