GCD:串行/并行/主队列下,同步/异步的执行方式

简介: 喜欢我的可以关注收藏我的个人博客:RobberJJGCD中获取各种类型的队列://获取串行的队列 dispatch_queue_t singalQueue = dispatch_queue_create("single",DISPATCH_QU...

喜欢我的可以关注收藏我的个人博客:RobberJJ

GCD中获取各种类型的队列:

//获取串行的队列  
dispatch_queue_t singalQueue = dispatch_queue_create("single",DISPATCH_QUEUE_SERIAL);
//获取并发执行的队列
dispatch_queue_t concrtQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//获取主队列
dispatch_queue_t mainQueue =  dispatch_get_main_queue();
//获取全局的队列(并发的)
dispatch_queue_t gobalqueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

<h6>串行队列异步执行任务</h6>

  1. 异步具有创建新线程的能力,会开辟新线程去执行任务;
  1. 按照串行的方式去执行任务。

如下调用方式可参考:
- (void)singalAsynQueue{
//创建串行队列
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
//在singalQueue中异步执行任务(该方法实现在本文后续中)
[self asynWithQueue: singalQueue];
}

<h6>串行队列同步执行任务</h6>

  1. 同步不具有创建新的线程的能力, 不会开辟新的线程去执行任务,会在当前的程序的主线程中去执行任务;
  1. 按照串行的方式去执行任务。

如下调用方式可参考:
- (void)singalSynQueue{
//创建串行队列
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
//在singalQueue中同步执行任务(该方法实现在本文后续中)
[self synWithQueue: singalQueue];
}

<h6>并发队列异步执行任务(常用)</h6>

  1. 异步具有创建新的线程的能力,会开辟新的线程去执行任务,不会在当前的程序的主线程中去执行任务;
  1. 按照并发的方式去执行任务。

如下调用方式可参考:
- (void)concrtAsynQueue{
//创建并发执行的队列
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//获取全局的队列
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在concrtQueue中异步执行任务(该方法实现在本文后续中)
[self asynWithQueue:concrtQueue];
}

<h6>并发队列同步执行任务</h6>

  1. 同步不具有创建新的线程的能力, 不会开辟新的线程去执行任务,会在当前的程序的主线程中去执行任务;
  1. 按照同步的方式去执行任务。

如下调用方式可参考:
- (void)concrtSynQueue{
//创建并发执行的队列
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//获取全局的队列
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//在concrtQueue中同步执行任务(该方法实现在本文后续中)
[self synWithQueue:concrtQueue];
}

<h6>主队列的同步(会造成程序的死锁)</h6>

如下:
- (void)mainSynQueue{
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在mainQueue中同步执行任务(该方法实现在本文后续中)
[self synWithQueue:mainQueue];
}

<h6>主队列的异步(在主线程中顺序执行)</h6>

新添加到主队列中的任务会放到队列的最尾部,等到当前主线程中的任务结束之后然后再从队列的头部取出依次执行(FIFO)先进先出。

如下调用方式可参考:
- (void)mainAsynQueue{
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//在mainQueue中异步执行任务(该方法实现在本文后续中)
[self asynWithQueue:mainQueue];
}

<h6>异步方法的实现</h6>

- (void)asynWithQueue:(dispatch_queue_t)queue{
    NSLog(@"%@",[NSThread currentThread]);
    
    dispatch_async(queue, ^{
        NSLog(@"----1----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"----2----%@",[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----3----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"----4----%@",[NSThread currentThread]);
    });
    
    NSLog(@"--------end------------");
}

<h6>同步方法的实现</h6>

- (void)synWithQueue:(dispatch_queue_t)queue{
    NSLog(@"%@",[NSThread currentThread]);
    
    dispatch_sync(queue, ^{
        NSLog(@"----1----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"----2----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"----3----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"----4----%@",[NSThread currentThread]);
    });
    
    NSLog(@"--------end------------");
}
目录
相关文章
|
前端开发
异步转同步的几种方法
在循环等待中,我们可以使用一个变量来指示异步操作是否已完成。然后,我们可以在循环中检查该变量,如果它指示异步操作已完成,则退出循环。
559 0
|
2月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
7月前
|
Python
同步和异步的区别
同步和异步的区别
|
JavaScript 前端开发 UED
同步和异步区别
同步和异步区别
154 0
|
7月前
同步和异步的区别?
同步和异步的区别?
163 0
|
7月前
线程间的同步的方式有哪些
线程间的同步的方式有哪些
|
7月前
|
前端开发 JavaScript
同步和异步有什么区别
同步和异步有什么区别
236 0
|
7月前
|
Java
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
79 0
同步和异步[多线程的异步执行操作]
同步和异步[多线程的异步执行操作]
52 0
|
Java 程序员
同步模式之顺序控制线程执行
同步模式是指在多线程编程中,为了保证线程之间的协作和正确性,需要对线程的执行顺序进行控制。顺序控制线程执行是一种同步模式,它通过控制线程的等待和唤醒来实现线程的有序执行。
141 0
同步模式之顺序控制线程执行