Gcd的优点
Gcd是苹果面向多核并行计算的解决方案
Gcd会自动利用更多CPU核心(例如双核心四核心)
Gcd自动管理线程的生命周期(创建线程保留任务删除线程)
程序员只需要告诉gcd要做什么,不需要写线程管理代码。
Gcd的两项核心工作
任务:要执行的任务
队列:准备作业
Gcd使用的两个阶段
创建任务:确定要执行的任务
向队列添加任务
Gcd会自动从队列中取出任务,然后在该线程上运行
工作检出遵循队列的FIFO原则,即先进先出、后进先出。
//1。创建队列
dispatch _ queue _ tqueue=dispatch _ get _ global _ queue(0,0);
//2。创建作业
Dispatch _ block _ t task={
Nslog (@' hello% @ ',[ns thread current thread]);
}
//3。异步执行
Dispatch_async(queue、task);
dispatch _ async(dispatch _ get _ global _ queue(0,0),{
Nslog (@' hello% @ ',[ns thread current thread]);
});
//异步执行下载打开网页图片
dispatch _ async(dispatch _ get _ global _ queue(0,0),{
ns URL * URL=[nsurl urlwithstring : @ ' '];
ns dat a* data=[nsdata datawithcontentsofurl : URL];
ui image * image=[ui image imagewithdata 3360 data];
//返回到主线程序更新UI
dispatch _ sync(dispatch _ get _ main _ queue(),{
self . image view . image=image;
[self . image view size tofit];
self . scroll view . content size=image . size;
});
});
Gcd队列可分为两大类
并发队列
可以同时运行多个任务(自动打开多个线程并同时运行任务)
并发功能仅在异步函数中有效
串行队列
逐个执行任务(一个任务运行完成后执行下一个任务)
确定是否同步/异步打开新线程
同步:无法在当前线程上执行操作和打开新线程
异步:允许您在新线程上执行操作和打开新线程
并发和串行操作决定了作业的执行方式
并发:同时运行多个任务
串行:一个作业运行完成后,将执行以下操作
串行队列的同步执行将按顺序执行,而不打开新的线程任务
//1。串行队列的并发执行串行端口的含义
dispatch _ queue _ t queue=dispatch _ queue _ create(' hello ',dispatch _ queue _ serial);
Dispatch _ sync (queue,{
Nslog (@' hello% @ ',[ns thread current thread]);
});
执行多个任务时
dispatch _ queue _ t queue=dispatch _ queue _ create(' hello ',dispatch _ queue _ serial);
for(int I=0;i5;I ){
Dispatch _ sync (queue,{
Nslog (@' hello% d% @ ',I,[ns thread current thread]);
});
}
//2。序列伫列的非同步执行开启一个新执行绪工作。依序执行
dispatch _ queue _ t queue=dispatch _ queue _ create(' hello ',dispatch _ queue _ serial);
for(int I=0;i5;I ){
Dispatch _ async (queue,{
Nslog (@' hello% d% @ ',I,[ns thread current thread]);
});
}
//1。运行并行队列同步
Dispatch_queue_t queue=dispatc
h_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(只有一个)
一般我们使用全局队列
*/
/*
同步任务的特点
队列调度多个异步任务前,指定一个同步任务,让所有的
异步任务都等待同步任务完成,这就是所谓的依赖关系
*/