标签:
多线程:
GCD Grand Center Dispatch 中央派遣, 极重要的中心派遣, 任务和队列,任务,执行什么操作,队列:存放任务.
并发队列,异步, DISPATCH_QUEUE_CONCURRENT, dispatch_async(queue,^{});
创建多个线程,并发执行, 创建的任务不会立即执行,添加完毕后,这个函数结束之后,再开始并发执行线程,
并发队列,同步: DISPATCH_QUEUE_CONCURRENT ,dispatch_sync(queue,^{});
执行不会开启线程,在主线程同步执行各个子线程,是添加过任务后立即执行,之后才能下一个任务. 有做啥哦任务都是在主线程里完成:
串行,同步任务: DISPATCH_QUEUE_SERIAL ,dispatch_sync(queue,^{});
串行队列+同步任务:不会开启新线程,在父线程中同步执行各个子线程,也就是逐一执行,并且是添加过任务后立即执行,之后才能添加 下一个任务
串行队列 +异步任务,
创建新线程,但是只会创建一个新线程,所有的任务都是在这个子线程的里执行,执行顺序按照任务的添加的顺序,并且不是立即执行,而是等着当前的方法结束的时候再执行,
主队列
自带的特殊的串行队列, dispatch_get_main_queue();
全局并发队列,
dispatch_get_global_queue(优先级,0);全局并发队列的特性和手动创建的队列一样.
主队列 + 异步任务
不创建新线程,在父线程里执行,执行顺序按照添加任务的先后任务,并且不是立即执行,而是等这个方法结束后以此执行,
主队列 + 同步任务
会产生死锁. 这个会产生问题,死锁,添加任务到主队列的任务要求立即执行,但是主队列是串行队列,当前任务要求执行完当前任务在执行新添加的任务。结果就是:两个任务互相等待,产生死锁
截止执行 dispatch_barrier_async
:截断线程执行,以上两个任务完成后才会执行这个任务,并在完成barrier后继续执行下面的任务 任务1,2的执行始终在任务3,4之前 只有在并发队列中才有阶段功能
1.串行之系统方式,主线程
dispatch_queue_t main =dispatch_get_main_queue();
dispatch-async(main,^{}); 在主线程队列中执行block方法, 异步也是顺序执行,主队列是顺序执行,串行的。
2.串行之自定义方式,
dispatch_queue_t queue=dispatch_queque_creat("245",DISPATCH_QUEUE_SERIAL);
DISPATCH_QUEUE_SERIAL 参数固定了执行方式,串行的执行方式,虽然是异步执行自定义队列的多个任务,也是按添加顺序执行的。只有一个线程,
dispatch_async(queue,^{});在主线程中执行 将block任务放在自定义的队列,
3.并行方式,全局队列,系统自带的并行处理方式,异步执行,多线程。当线程执行结束的时候才释放,下一个方能使用。
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEQUE_PRIORITY_DEFAULT,0);
第一个参数是全局队列的优先级,第二个参数是系统保留参数。
4.并行自定义。
dispatch_queque_t current=dicpatch_queue_create("y12",DISPATCH_QUEUE_CONCURRENT);
在并行队列 中执行异步处理。
5.dispatch_queue_t time=dispatch_time(DISPATCH_TIME_NOW,time*NSEC_PER_SEC)
dispatch_after(time1,globe,^{});
在子线程中通信,给主线程添加一个任务,所谓的子线程和主线程之间的通信,就是在子线程中给主线程列加一个任务,
1.让一个任务重复执行,拿到队列,添加一个重复的任务,
2.让任务只执行一次,static dispatch_once_t once;
dispatch_once(&once,^{});
封装一个方法,在多线程中异步处理图片加载,回到主线程更新UI。
UI21-多线程: GCD Grand Center Dispatch
标签:
原文地址:http://www.cnblogs.com/ytmaylover/p/5050098.html