线程
:进程的基本执行单元
多线程
:从软件或者硬件上实现多个线程并发执行的技术
串行
:让任务一个接着一个执行
并行
:可以让多个任务同时进行,(多个线程同时执行任务)
同步
:在当前线程中执行任务,不可以开启新线程
异步
:可以在新线程中执行任务,可以开启新线程
GCD:
- 会自动管理线程的生命周期,会自动创建线程调度线程销毁线程
- 自动利用更多的CPU资源
- 程序员只需要告诉GCD想要执行什么任务,不需要添加自管理线程的代码
队列与任务
1.队列:
用来存放任务的队列,采用FIFO(先进先出)原则
dispatch_get_main_queue
:主线程队列
dispatch_get_global_queue
:全部线程队列
创建队列
// 串行队列的创建方法
dispatch_queue_t queue= dispatch_queue_create("test.serial.queue", DISPATCH_QUEUE_SERIAL);
// 并发队列的创建方法
dispatch_queue_t queue= dispatch_queue_create("test.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
//主线程
dispatch_queue_t queueMain = dispatch_get_main_queue();
//全局线程
dispatch_queue_t queueGlobal = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.任务:
需要在线程中执行的代码
创建任务
// 同步执行任务创建方法
dispatch_sync(queue, ^{
[self dosomething]
});
// 异步执行任务创建方法
dispatch_async(queue, ^{
[self dosomething]
});
GCD六种组合方式
- 1
并发队列+同步执行
没有开启新线程,串行执行任务 - 2
并发队列+异步执行
开启新线程,并行执行任务 - 3
串行队列+同步执行
没有开启新线程,串行执行任务 - 4
串行队列+异步执行
开启一条新线程,串行执行任务 - 5
主队列+同步执行
没有开启新线程,串行执行任务(互等卡住不可行) - 6
主队列+异步执行
没有开启新线程,串行执行任务
常用Demo
回到主线程操作
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
//执行耗时任务
NSLog(@"start task");
[NSThread sleepForTimeInterval:3];
dispatch_async(dispatch_get_main_queue(), ^{
//回到主线程刷新UI
NSLog(@"refresh UI");
});
});
栅栏
dispatch_barrier_
在队列中加入一个栅栏,可以保证两组操作可以分割开来进行
延时
dispatch_after
延迟执行一段代码
一次性代码
dispatch_once
整个程序中只执行一次
队列组
dispatch_group
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self dosomething]
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self dosomething]
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//回到主线程
[self dosomething]
});
小白总结,欢迎打脸指正
网友评论