GCD实现多线程:分为串行队列和并行队列
1.串行队列:是队列里面的线程执行结束,才开始执行后面的线程
2.并行队列所有的线程同时进行,谁抢到cpu执行的时间最多,谁先执行
使用队列创建多线程
系统自动创建了这个队列,我们只要获取后使用
dispatch_queue_t mainQueue = dispatch_get_main_queue();
系统的全局队列,
系统自动创建的这个队列,我们只能获取后使用
第一个参数是队列的优先级,第二个参数是第二个参数是apple保留的参数,传一个0就可以了
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
A:表示一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
B:表示一个并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
3.异步将线程的执行体代码放到队列执行,
第一个参数是队列。第二个参数是线程的执行体代码
dispatch_queue_t queueOne = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
异步的方式
dispatch_async(queueOne, ^{
for (int i = 0; i< 100; i++) {
NSLog(@"异步的方式%d",i);
}
});
4.同步的方式。
dispatch_sync(queueOne, ^{
for (int i = 0; i< 100; i++) {
NSLog(@"同步的方式%d",i);
}
});
GCD线程的使用:
5.同一块代码执行多次
第一个参数:代码块执行多少次
第二个参数:线程所在的队列
第三个参数:线程的执行体
dispatch_queue_t globQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, globQueue, ^(size_t time) {
//线程的执行体,表示执行到了多少
NSLog(@"执行到了%ld",time);
});
6.代码只执行一次,通常用来实现单例
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
NSLog(@"执行了一次");
});
7.在一段时间之后执行代码块
第一个参数:代码块执行的时间
第二个参数:代码块的线程所在的队列
第三个参数:执行的代码块
第一个参数表示时间,第二个参数表示当前时间10秒后
dispatch_time_t myTime = dispatch_time(DISPATCH_TIME_NOW,NSEC_PER_SEC*10);
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
第一个参数:代码块执行的时间,第二个执行的队列,第三个参数代码块
dispatch_after(myTime, concurrentQueue, ^{
NSLog(@"执行了代码块");
});
8.多个线程都执行后去执行一些代码
先创建一个线程组
dispatch_group_t group = dispatch_group_create();
第一个参数是线程所在的组,第二个参数是线程所在的队列,第三个参数是线程的执行体,
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 100; i++) {
NSLog(@"执行了线程1--%d",i);
}
});
第二个线程
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 100; i++) {
NSLog(@"执行了线程2++%d",i);
}
});
在改组的所有线程都执行结束时作执行的代码
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"所有线程都执行完成");
});
9.在多个线程都执行完成之后并在另外几个线程都执行完成执前需要执行一些代码
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
线程1
dispatch_async(concurrentQueue, ^{
for (int i = 0; i<100; i++) {
NSLog(@"线程:1%d",i);
}
});
线程2
dispatch_async(concurrentQueue, ^{
for (int i = 0; i<100; i++) {
NSLog(@"线程2:%d",i);
}
});
在线程1和线程2执行完成之后,并且在线程3执行完成之前实现的代码块
dispatch_barrier_async(concurrentQueue, ^{
NSLog(@"Barrier");
});
线程3
dispatch_async(concurrentQueue, ^{
for (int i = 0; i<100; i++) {
NSLog(@"线程3:%d",i);
}
});