gcd 控制线程执行顺序(供参考)

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
});

==========================

关于gcd 和  nsoperation

GCD和NSOperation的区别
1、GCD是一种轻量级的方法来实现多线程。控制起来比较麻烦,比如取消和暂停一个线程。
2、NSOperation和NSOperationQueue相对于GCD效率上要低一点,他们是面向对象的方式,从Mac OS X v10.6和iOS4开始,NSOperation底层也是用的GCD来实现的。可以在多个操作中添加附属,也可以重用操作,取消或者暂停。NSOperation和KVO是兼容,也就是说,可以在NSOperation中使用KVO,例如,你可以通过NSNotificationCenter去让一个操作开始执行。

3、NSOperation的使用方法
【1】、继承NSOperation类
【2】、重写“main”方法
【3】、在“main”方法中创建一个autoreleasepool
【4】、将自己的代码放在autoreleasepool中
注意:创建自动释放池的原因是,你不能访问主线程的自动释放池,所以需要自己创建一个。

4、NSOperation的常用方法
【1】、start:开始方法,当把NSOperation添加到NSOperationQueue中去后,队列会在操作中调用start方法。
【2】、addDependency,removeDependency:添加从属性,删除从属性,比如说有线程a,b,如果操作a从属于b,那么a会等到b结束后才开始执行。
【3】、setQueuePriority:设置线程的优先级。例:[a setQueuePriority:NSOperationQueuePriorityVeryLow];一共有四个优先级:NSOperationQueuePriorityLow,NSOperationQueuePriorityNormal,NSOperationQueuePriorityHigh,NSOperationQueuePriorityVeryHigh。
当你添加一个操作到一个队列时,在对操作调用start之前,NSOperationQueue会浏览所有的操作,具有较高优先级的操作会优先执行,具有相同优先级的操作会按照添加到队列中顺序执行。
【4】、setCompletionBlock:设置回调方法,当操作结束后,会调用设置的回调block。这个block会在主线程中执行。

说法二

GCD是基于c的底层api,NSOperation属于object-c类。ios 首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现的。

相对于GCD:
1,NSOperation拥有更多的函数可用,具体查看api。
2,在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。
3,有kvo,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)。
4,NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。
GCD主要与block结合使用。代码简洁高效。
  GCD也可以实现复杂的多线程应用,主要是建立个个线程时间的依赖关系这类的情况,但是需要自己实现相比NSOperation要复杂。
具体使用哪个,依需求而定。 从个人使用的感觉来看,比较合适的用法是:除了依赖关系尽量使用GCD,因为苹果专门为GCD做了性能上面的优化。

时间: 2024-08-10 14:13:35

gcd 控制线程执行顺序(供参考)的相关文章

Java多线程系列四——控制线程执行顺序

假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatch类:指定计数器,当计数器清零即取消阻塞 import java.util.concurrent.CountDownLatch; import org.junit.Assert; import org.junit.Test; /** * @Description: 规定线程次序的方法 */ publ

如何控制多线程执行顺序

package com.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 如何控制多线程执行顺序 * 1.join方法,让主线程等待子线程执行完后再执行 * 2.newSingleThreadExecutor,创建执行单个任务的线程池执行.保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行 */ public class ThreadFIF

关于for 循环里 线程执行顺序问题

最近在做项目时遇到了 这样的需求 要在一个for循环里执行下载的操作, 而且要等 下载完每个 再去接着走循环.上网查了一些 觉得说的不是很明确.现在把我用到的代码 贴上 希望可以帮到有此需求的开发者        private Handler mHandler = new Handler() {               public void handleMessage(android.os.Message msg) {                       switch (msg.

使用 CountDownLatch 控制多个线程执行顺序

有时候会有这样的需求,多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工作结束后,才能开始.举个例子,开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段,那么这时候我们可以考虑使用CountDownLatch来控制并发. CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一

main入口方法中创建线程执行顺序的问题

1 public static void main(String args[]) { 2 3 4 Thread t1=new Thread(){ 5 public void run(){ 6 System.out.println("1"); 7 } 8 }; 9 Thread t2=new Thread(){ 10 public void run(){ 11 System.out.println("2"); 12 } 13 }; 14 t1.run(); 15 t2

4. 控制脚本执行顺序

关于CountDownLatch控制线程的执行顺序

在上一篇文章中说过使用thread.join()方法.newSingleThreadExecutor单线程池来控制线程执行顺序.在文章的末尾我提出了一种构想,可否使用经典的生产者和消费者模型来控制执行顺序.在本文中,我将使用CountDownLatch来解决这个问题. 上图是countDownLatch的原理示意图.官方文档给出的解释是:CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行.上图中线程A调用方法await()之后,进行阻塞,然后线

如何控制线程的执行顺序

错误示例: 1 public class Test { 2 public static void main(String[] args){ 3 thread1.start(); 4 thread2.start(); 5 thread3.start(); 6 } 7 8 static Thread thread1 = new Thread(new Runnable() { 9 @Override 10 public void run() { 11 System.out.println("threa

线程的执行顺序

线程的执行完全是自发的去抢CPU时间片,谁先抢到谁就先去执行package com.pers.xiancheng; public class Test implements Runnable { int count;//默认是0 static Object obj = new Object(); @Override public void run() { //synchronized块锁定的是整个对象 synchronized (obj) {//synchronized 是用来获得对象锁,只有获