GCD简析(同步、异步、串行、并行)

2024-06-18 21:48

本文主要是介绍GCD简析(同步、异步、串行、并行),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
*
*需求规定:四个耗时任务A、B、C、D,要求先执行A,A执行完毕后才能开始B和C,但是B和C没有先后顺序,即并发执行,但是必须B和C都结束以后才能执行D。
*因为四个任务都是耗时任务,所以必须放入子线程中才行,否则会导致线程阻塞,又B和C并发执行,所以B和C是异步并发执行的任务。下面是具体代码。
*/

//对任务A创建一个SERIAL队列,即同时只执行一个任务
dispatch_queue_t aqueue = dispatch_queue_create("aqueue", DISPATCH_QUEUE_SERIAL);
//A任务采用异步线程执行
dispatch_async(aqueue, ^{
[NSThread sleepForTimeInterval:5];NSLog(@"A");
});
//因为B和C是并发进行的所以我们将B和C放到同一个队列,但是异步并发执行,因此用到了dispatch_group_t,并且要求全部使用dispatch_async执行
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(aqueue, ^{//任务组B、Cdispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"B");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"C");});//B、C都执行完毕后会通知dispatch_group_notify去执行Ddispatch_group_notify(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"D");});
});
/****当然我们也可以如下执行:即使用dispatch_barrier_async这个方法,在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行。这样就可以将A|BC|D这样分开执行,同时达到我们的要求*/
//这里一定要使用DISPATCH_QUEUE_CONCURRENT,如果使用DISPATCH_QUEUE_SERIAL就不会并发执行B和C,而是按照顺序B执行完才执行C最后是D,如果使用DISPATCH_QUEUE_PRIORITY_DEFAULT是不起作用的,因为DISPATCH_QUEUE_PRIORITY_DEFAULT是系统默认的线程即dispatch_get_global_queue管理方法,而我们这里是使用自定义线程。所以也不会按照我们的需求执行。
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
//A任务采用异步线程执行
dispatch_async(queue, ^{[NSThread sleepForTimeInterval:5];NSLog(@"A");
});
//dispatch_barrier_async执行任务
dispatch_barrier_async(queue, ^{dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"B");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"C");});//B、C都执行完毕后会通知dispatch_group_notify去执行Ddispatch_group_notify(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"D");});
});

这篇关于GCD简析(同步、异步、串行、并行)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073144

相关文章

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Java之并行流(Parallel Stream)使用详解

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集... 目录Java并行流(Parallel Stream)1. 核心概念与原理2. 创建并行流的方式3. 适

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,