多线程的执行原理
CPU同一时间只能处理一个线程,只有一个线程在执行。多线程“同时“执行 是CPU快速的在多个线程之间的切换.CPU执行速度较快,导致CPU调度线程的时间足够短,造成同时执行的假象。线程会提高程序执行的效率,但并不是线程数量越多越好,线程过多会导致CPU之间频繁的切换,消耗大量的资源。
iOS多线程的技术方案
GCD介绍
1、什么是GCD
全称:Grand Central Dispatch
纯C语言,提供非常多强大的函数库
2、GCD的优势
- GCD是苹果公司为多核的并行运算提出的解决方案
- GCD会自动利用更多的CPU内核
- GCD会自动的管理线程的生命周期
- 程序员只需要告诉GCD想要执行什么代码,不需要编写任何线程管理代码
GCD的使用介绍
1、GCD的两个核心
1.任务:要执行的操作
2.队列:用来存放任务
2、GCD的使用步骤
1.创建队列
2.创建任务
3.将任务添加到队列上
- GCD会自动将队列中的任务取出,放到对应的线程中去执行
- 任务的取出遵循队列的FIFO原则:先进先出,后进后出
GCD执行任务的方式
1、同步的方式执行任务
- 在主线程中执行任务,不具备开启新线程的能力
2、异步的方式执行任务
- 在新的线程上执行任务,具备开启新线程的能力
GCD队列的类型
1、并发队列
可以让多个任务并发同时执行
并发功能只有在异步函数下才有效
2、串行队列
让任务一个接着一个的执行
GCD各种队列执行效果
主线程里有任务就必须等主线程任务执行完才轮到主队列
主队列一定是在主线程上执行的,主队列是全局的串行队列
代码演示
// 1 串行队列 同步执行。 不开新线程,任务按顺序执行
- (void) demo1{
NSLog(@"开始");
dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_SERIAL);
for (int i = 0 ; i < 10; i++) {
dispatch_sync(queue, ^{
NSLog(@"hello %d, %@",i, [NSThread currentThread]);
});
}
NSLog(@"结束");
}
//2 串行队列 异步执行 开启一个线程。 任务还是顺序执行
- (void) demo2{
NSLog(@"开始");
dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_SERIAL);
for (int i = 0 ; i < 10; i++) {
dispatch_async(queue, ^{
NSLog(@"hello %d, %@",i, [NSThread currentThread]);
});
}
NSLog(@"结束");
}
//3 并行队列,同步执行 (同串行队列,同步执行类型)不开线程,顺序执行
- (void) demo3{
NSLog(@"开始");
dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0 ; i < 10; i++) {
dispatch_sync(queue, ^{
NSLog(@"hello %d, %@",i, [NSThread currentThread]);
});
}
NSLog(@"结束");
}
//4 并行队列 异步执行。 开多个线程。无序执行 ,线程有共用
- (void) demo4{
NSLog(@"开始");
dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0 ; i < 10; i++) {
dispatch_async(queue, ^{
NSLog(@"hello %d, %@",i, [NSThread currentThread]);
});
}
NSLog(@"结束");
}
//5 主队列 异步执行 在主线程上顺序执行
//主队列的特点: 先执行主线程上的代码,才会执行主队列中的任务
- (void) demo5{
//主队列
NSLog(@"开始");
for (int i = 0; i < 10; i++) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
NSLog(@"结束");
}
//6 主队列 同步执行 --会死锁,在主线程上执行才会死锁。
//同步执行: 会等待第一个任务执行完成才会继续往后执行。
- (void) demo6{
NSLog(@"开始");
for (int i = 0; i < 10; i++) {
//死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
NSLog(@"结束");
}
//7 解决死锁的问题
- (void) demo7{
NSLog(@"开始");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 10; i++) {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
});
NSLog(@"结束");
}
end