首先简单的了解一下GCD 它是Apple开发的一种解决多核编程的方法 之前我介绍过系统中提供的NSThread来创建运用多线程 在iOS开发中 我们较多的用GCD来解决多线程中的问题
我们把只有一个主线程的的程序称为单线程程序 单线程中主线程负责所有代码的(UI展示 网络请求 本地存储)执行 '而且所有代码只能顺序执行 不能并发执行 在实际开发中 我们为了程序的高效执行我们会创建多个子线程 这些子线程和主线程是彼此独立的单元 互不影响 并发执行 从而提高程序的执行效率
// 线程分为同步线程 异步线程
// 队列的创建: 串行队列 并发队列 主队列 全局队列(其中串行队列 并发队列是我们自定义的队列)
// 下面 我们将线程分为同步和异步两个部分来考虑
// 创建4个队列(串行队列 并发队列 主队列 全局队列)
// 创建串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
// 创建并发队列
dispatch_queue_t conCurrentQueue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
// 创建主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 创建全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
// 同步线程(对四种不同的队列进行分析)
// [self syncSerialQueue:serialQueue];
// [self syncConCurrent:conCurrentQueue];
// [self syncMainQueue:mainQueue];
// [self syncGlobalQueue:globalQueue];
// 异步线程(对四种不同的队列进行分析)
// [self asyncSerialQueue: serialQueue];
// [self asyncConCurrentQueue:conCurrentQueue];
// [self asyncMainQueue:mainQueue];
// [self asyncGlobalQueue:globalQueue];
// 总结 同步线程 无论是那种队列 都不会创建新的线程 都是在主线程中 注意相同线程不能同步相同线程 在iOS9.0会导致停止执行之后的程序 在iOS10.0会导致程序crush
// 串行: 一个任务执行完毕 再执行下一个任务
- (void)syncSerialQueue:(dispatch_queue_t)queue {
NSLog(@"同步串行队列");
for (int i = 0; i < 5; i++) {
dispatch_sync(queue, ^{
NSLog(@"%d-----%@", i, [NSThread currentThread]);
});
}
}
- (void)syncConCurrent:(dispatch_queue_t)queue {
NSLog(@"同步并发队列");
for (int i = 0; i < 5 ; i++) {
dispatch_sync(queue, ^{
NSLog(@"%d----- %@", i, [NSThread currentThread]);
});
}
}
- (void)syncMainQueue:(dispatch_queue_t)queue {
NSLog(@"主队列");
for (int i = 0; i < 5; i++) {
dispatch_sync(queue, ^{
NSLog(@"%d----- %@", i, [NSThread currentThread]);
});
}
}
- (void)syncGlobalQueue:(dispatch_queue_t)queue {
NSLog(@"同步全局队列");
for (int i = 0; i < 5; i++) {
dispatch_sync(queue, ^{
NSLog(@"%d-----%@", i, [NSThread currentThread]);
});
}
}
// ----------------------------- 异步 -----------------------
- (void)asyncSerialQueue:(dispatch_queue_t)queue {
NSLog(@"异步并发队列");
dispatch_async(queue, ^{
NSLog(@"%d-----%@", 1, [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"%d-----%@", 2, [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"%d-----%@", 3, [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"%d-----%@", 4, [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"%d-----%@", 5, [NSThread currentThread]);
});
}
- (void)asyncConCurrentQueue: (dispatch_queue_t)queue {
NSLog(@"异步并发队列");
// dispatch_async(queue, ^{
// NSLog(@"%d-----%@", 1, [NSThread currentThread]);
// });
// dispatch_async(queue, ^{
// NSLog(@"%d-----%@", 2, [NSThread currentThread]);
// });
// dispatch_async(queue, ^{
// NSLog(@"%d-----%@", 3, [NSThread currentThread]);
// });
// dispatch_async(queue, ^{
// NSLog(@"%d-----%@", 4, [NSThread currentThread]);
// });
// dispatch_async(queue, ^{
// NSLog(@"%d-----%@", 5, [NSThread currentThread]);
// });
for (int i = 0; i < 5; i++) {
dispatch_async(queue, ^{
NSLog(@"%d-----%@", i, [NSThread currentThread]);
});
}
}
- (void)asyncMainQueue:(dispatch_queue_t)queue {
NSLog(@"异步主队列");
for (int i = 0; i < 5; i++) {
dispatch_async(queue, ^{
NSLog(@"%d-----%@", i, [NSThread currentThread]);
});
}
}
- (void)asyncGlobalQueue:(dispatch_queue_t)queue {
NSLog(@"异步全局队列");
for (int i = 0; i < 5; i++) {
dispatch_async(queue, ^{
NSLog(@"%d-----%@", i, [NSThread currentThread]);
});
}
}
网友评论