台湾gcd是什么意思(gcdqcn)
gcd的优势gcd是苹果公司为多核的并行运算提出的解决方案
gcd会自动利用更多的cpu内核(如 双核 四核)
gcd会自动管理线程的生命周期(创建线程 调度任务 销毁线程)
程序员只需要告诉gcd想要执行什么任务,不需要写任何线程管理代码
gcd的两个核心任务任务:执行什么操作
队列:用来存放任务
gcd使用的两个步骤创建任务:确定要做的事情
将任务添加到队列中
gcd会自动将队列中的任务取出,放到对应的线程中执行
任务的取出遵循队列的FIFO原则:先进先出,后进后出
//1.创建队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//2.创建任务
dispatch_block_t task= ^{
NSLog(@"hello %@",[NSThread currentThread]);
};
//3.异步执行
dispatch_async(queue, task);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"hello %@",[NSThread currentThread]);
});
//开启异步执行下载网络图片
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL *url=[NSURL URLWithString:@""];
NSData *data = https://www.hedan60.com/baike2/[NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
//回到主线程更新UI
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image=image;
[self.imageView sizeToFit];
self.scrollView.contentSize=image.size;
});
});
gcd队列可以分为两大类并发队列
可以让多个任务并发(同时)执行 (自动开启多个线程同时执行任务)
并发功能只有在异步函数下才有效
串行队列
让任务一个接着一个执行(一个任务执行完毕后,在执行下一个任务)
同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后 在执行下一个任务
串行队列的同步执行 不开新线程 任务按顺序执行
//1.串行队列的同步执行 SERIAL串口的意思
dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"hello %@",[NSThread currentThread]);
});
多个任务时
dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_SERIAL);
for(int i=0;i<5;i++){
dispatch_sync(queue, ^{
NSLog(@"hello%d %@",i,[NSThread currentThread]);
});
}
//2.串行队列的异步执行 开启1个新线程 任务按顺序执行
dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_SERIAL);
for(int i=0;i<5;i++){
dispatch_async(queue, ^{
NSLog(@"hello%d %@",i,[NSThread currentThread]);
});
}
// 1.并行队列同步执行
dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++) {
dispatch_sync(queue, ^{
NSLog(@"hello %d --%@",i,[NSThread currentThread]);
});
}
//2.并行队列的异步执行开多个线程无序执行
dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++) {
dispatch_async(queue, ^{
NSLog(@"hello %d --%@",i,[NSThread currentThread]);
});
}
主队列主队列,异步任务
不开线程,同步执行
主队列特点,如果主线程正在执行代码暂时不调度任务,等主线程执行结束后在执行任务
主队列又叫 全局串行队列
主队列,同步执行
程序执行不出来(死锁)
死锁的原因,当程序执行到下面这段代码的时候
主队列:如果主线程正在执行代码,就不调度任务
同步执行:如果第一次任务没有执行,就继续等待第一个任务执行完成,在执行下一个任务时互相等待,程序无法往下执行(死锁)
//1.主队列,异步执行主线程顺序执行
//主队列的特点:先执行完主线程上的代码,才会执行主队列中的任务
for (int i=0; i<10; i++) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"hello %d----%@",i,[NSThread currentThread]);
});
}
//2.主队列,同步执行----主线程上才会死锁
//同步执行:会等着第一个任务执行完成,才会继续往后执行
for (int i=0; i<10; i++) {
//死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello %d----%@",i,[NSThread currentThread]);
});
}
主队列和串行队列
主队列和串行队列的区别
串行队列:必须等待一个任务执行完成,在调度另一个任务
主队列:以先进先出调度任务,如果主线程上有代码在执行,主队列不会调度任务
(主队列,同步执行)放入异步执行 解决死锁
//解决死锁的问题
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]);
});
}
});
全局队列的本质就是并发队列
//全局队列和并发队列的区别
/*
*并发队列有名称,可以跟踪错误,全局队列没有
*在ARC中不需要考虑释放内存,dispatch_release(q),不允许调用
在MRC中需要手动释放内存,并发队列是create创建出来的,在MRC中见到Create就要release,全局队列不需要release(只有一个)
一般我们使用全局队列
*/
/*
同步任务的特点
队列调度多个异步任务前,指定一个同步任务,让所有的
异步任务都等待同步任务完成,这就是所谓的依赖关系
【台湾gcd是什么意思(gcdqcn)】 */
- 症状|“胎毒”是什么?有必要去“胎毒”吗?
- 恐婚的人是什么心理(不想结婚是什么心理)
- 一个男人爱你的8种表现(爱上一个人是什么感觉)
- 台湾年轻人受不了(台湾年轻人想法)
- 白羊座的好处和坏处(巨蟹座的好处是什么优点是什么)
- 超甜虐狗是什么意思(甜到虐狗的国产电视剧)
- 近期明星夫妻综艺(逢场作戏是什么意思啊)
- 渣男渣女互相套路(渣男配渣女的下一句是什么)
- 周杰伦蔡依林是什么关系(周杰伦侯佩岑最后一次同台)
- 谈恋爱最重要的是什么(恋爱谈结局)