大佬说我要学会总结,所以最近就会把之前项目中的情况,总结拓展下:
在开发过程中经常用到队列和线程结合使用,给队列中添加任务有四种使用方法:串行队列中执行同步任务、串行队列中执行异步任务、并行队列中执行同步任务、并行队列中执行异步任务,还有主队列,下面先说下主队列
主队列
dispatch_get_main_queue()
常见的宏定义
解释:
主队列:专门负责调度主线程度的任务,没有办法开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程,任务只会在主线程顺序执行。
1 . 主队列异步任务
主队列中放入异步任务,不是马上执行,而是等到主队列中的其它所有除我们使用代码添加到主队列的任务都执行完毕之后,才会执行我们使用代码添加的任务。
例如
NSLog(@"------------------1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"主队列异步 %@",[NSThread currentThread]);
});
NSLog(@"------------------2");
执行结果:
------------------1
------------------2
主队列异步 {number = 1, name = main}
2 . 主队列同步任务
容易阻塞主线程,因为代码任务需要马上执行,但是主线程正在执行代码任务的方法体,因此代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,因此就形成了相互等待,造成了死锁
// 主队列同步
NSLog(@"------------------1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"主队列同步 %@",[NSThread currentThread]);
});
NSLog(@"------------------2");
二 . 串行队列
1 . 串行队列执行同步任务
在主线程中依次执行任务,不会开启新线程
dispatch_queue_t queue =dispatch_queue_create("jz",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task1------%@", [NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task2------%@", [NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task3------%@", [NSThread currentThread]);
}
});
执行结果是依次执行顺序内容
2 . 串行队列执行异步任务
在主线程之外新建一个线程,在新建的线程中依次执行任务
dispatch_queue_t queue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task1------%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task2------%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task3------%@", [NSThread currentThread]);
}
});
执行的结果依然是依次执行
三 . 并行队列
1 . 并行队列执行同步任务
主线程中依次执行任务,不会开启新线程
dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task1------%@", [NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task2------%@", [NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task3------%@", [NSThread currentThread]);
}
});
//并行队列 同步进行 依次打印线程
2 . 并行队列执行异步任务
三个任务同时执行
dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task1------%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task2------%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i =0; i <3; i ++) {
NSLog(@"task3------%@", [NSThread currentThread]);
}
---------------------
并发队列 异步进行 就发现线程已经不是同步顺序了,打印内容是 都在处理线程任务
在业务使用中,大部分使用的就是异步线程去执行相应的业务,所以使用的过程中 平常注意FIFO的原则 以及 可能会造成的死锁等问题