结合GCD来简单分析同步、异步、串行、并行。
正在进行中的程序被称为进程(一个正在运行的App),负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间。线程是进程中一个独立的执行路径(控制单元),一个进程中至少包含一条线程,即主线程,线程里面有非常多的任务(同步,异步)
1.同步 dispatch_sync
按照代码的编写顺序执行
2.异步 dispatch_async
并发执行,无法确定任务的执行顺序
3.串行队列 DISPATCH_QUEUE_SERIAL
任务按照顺序被调度,前一个任务不执行完毕,队列不会调度,任务只会顺序执行
4.并行队列 DISPATCH_QUEUE_CONCURRENT
只要有空闲的线程,队列就会调度当前任务,交给线程去执行,不会强制来等待上一个任务执行完毕,而是会在有空闲线程时来继续调度下一个任务
串行队列同步执行
队列会按顺序来调度任务,任务在一个线程里运行
dispatch_queue_t serialQueue = dispatch_queue_create( "my.serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一条%@",[NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二条%@",[NSThread currentThread]);
}
});
dispatch_sync(serialQueue, ^{
NSLog(@"第三条%@",[NSThread currentThread]);
});
串行队列异步执行
按顺序来调度任务,任务会创建新的线程
dispatch_queue_t serialQueue = dispatch_queue_create( "my.serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一条%@",[NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二条%@",[NSThread currentThread]);
}
});
dispatch_async(serialQueue, ^{
NSLog(@"第三条%@",[NSThread currentThread]);
});
并行队列同步执行
不会等待一个任务执行完毕便再次调度下一个任务(调度任务,不控制任务的执行),但同步任务不会开启新的线程
dispatch_queue_t conCurrentQueue = dispatch_queue_create( "my.conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一条%@",[NSThread currentThread]);
});
dispatch_sync(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二条%@",[NSThread currentThread]);
}
});
dispatch_sync(conCurrentQueue, ^{
NSLog(@"第三条%@",[NSThread currentThread]);
});
并行队列异步执行
操作会新建多个线程、操作无序执行,不会强制来等待上一个任务执行完毕,而是会在有空闲线程时来继续调度下一个任务,而此时任务会创建新的线程来执行,故这种组合可以实现任务的并发
dispatch_queue_t conCurrentQueue = dispatch_queue_create( "my.conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
}
NSLog(@"第一条%@",[NSThread currentThread]);
});
dispatch_async(conCurrentQueue, ^{
for (int i = 0; i < 100000; i++) {
if (i == 99999)
NSLog(@"第二条%@",[NSThread currentThread]);
}
});
dispatch_async(conCurrentQueue, ^{
NSLog(@"第三条%@",[NSThread currentThread]);
});