当前位置: 首页 > news >正文

兰州建设厅网站网游推广员

兰州建设厅网站,网游推广员,租房网站的财务分析表怎么做,招代理网站建设公司当我们在项目中遇到很多业务同时处理,如果是串行肯定是影响性能的,这时候就需要异步执行了,说道异步肯定就有很多方案了 方案一: 比如使用spring的异步注解,比如下面的代码,每个方法上面都是异步注解,当时…

当我们在项目中遇到很多业务同时处理,如果是串行肯定是影响性能的,这时候就需要异步执行了,说道异步肯定就有很多方案了

方案一:

比如使用spring的异步注解,比如下面的代码,每个方法上面都是异步注解,当时这种方案很多不足点,首先就是他的显示创建线程无法实现线程复用,然后就是无法统一处理异常及任务是否执行完了

class void test(){test01();test02();test03();
}

方案二 使用线程池

CountDownLatch 使用

线程池可以实现线程复用肯定是异步执行的不二选择
使用CountDownLatch:您可以在每个任务完成时递减 CountDownLatch,然后主线程等待 CountDownLatch 的计数为零,以确定所有任务都已经完成。这需要一些额外的编程工作,但允许更灵活的控制

int numberOfTasks = 10;
ExecutorService executorService = Executors.newFixedThreadPool(5);
CountDownLatch countDownLatch = new CountDownLatch(numberOfTasks);for (int i = 0; i < numberOfTasks; i++) {executorService.submit(() -> {// 执行任务countDownLatch.countDown();});
}try {countDownLatch.await();System.out.println("所有任务已经执行完毕");
} catch (InterruptedException e) {System.err.println("等待被中断");
}
executorService.shutdown();

awaitTermination

使用awaitTermination方法:ExecutorService 接口提供了 awaitTermination 方法,该方法允许您等待一段时间来检查线程池中的任务是否已经执行完。例如:

ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交任务到线程池executorService.shutdown(); // 停止接受新任务
try {if (executorService.awaitTermination(10, TimeUnit.SECONDS)) {System.out.println("所有任务已经执行完毕");} else {System.out.println("等待超时,仍有任务未执行完");}
} catch (InterruptedException e) {System.err.println("awaitTermination被中断");
}

invokeAll

ExecutorService executorService = Executors.newFixedThreadPool(5);
List<Callable<Void>> tasks = new ArrayList<>();
// 添加任务到tasksList<Future<Void>> futures = executorService.invokeAll(tasks);
for (Future<Void> future : futures) {if (!future.isDone()) {System.out.println("仍有任务未执行完");break;}
}
executorService.shutdown();

方案三

既然使用了线程池能否再优化下呢使用java8 毕竟流行的异步编程CompletableFuture
比如:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {此处可以将任务结果存放在一个集合或者一个对象中// 执行任务1System.out.println("Task 1 is running...");});CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {// 执行任务2此处可以将任务结果存放在一个集合或者一个对象中System.out.println("Task 2 is running...");});CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {// 执行任务3此处可以将任务结果存放在一个集合或者一个对象中System.out.println("Task 3 is running...");});CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2, future3);try {allOf.get(); // 等待所有任务完成System.out.println("All tasks are completed.");} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}

但是这种写法也不够优雅,因为每个异步任务都需要把结果存放出来 ,可以优化下

    private List<Object> asyncHandleTask(Map<String, TaskHandlerService> handleServiceMap, Map<String, TaskResultParserDTO> taskResultParserMap) {//提交任务List<CompletableFuture<List<Object>>> completableFutureList = handleServiceMap.entrySet().stream().map(entry -> CompletableFuture.supplyAsync(() -> entry.getValue().handle(taskResultParserMap.get(entry.getKey())), threadPoolTaskExecutor)).collect(Collectors.toList());//等待所有任务完成CompletableFuture<Void> allTaskFeatureList = CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0]));//等待所有任务完成或者CompletableFuture<Void>[] futures = new CompletableFuture[]{future1, future2, future3};CompletableFuture<Void> allOf = CompletableFuture.allOf(futures);   //等待所有任务完成或者CompletableFuture<Void> allTaskFeatureList = CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size]));//获取所有任务的结果数据CompletableFuture<List<List<Object>>> listCompletableFuture = allTaskFeatureList.thenApply(v -> completableFutureList.stream().map(CompletableFuture::join).collect(Collectors.toList()));List<List<Object>> resultList;try {resultList = listCompletableFuture.get();} catch (InterruptedException | ExecutionException e) {log.error("处理任务结果数据失败,{}", ExceptionUtils.getStackTrace(e));throw new CustomException(TaskProcessStatusEnum.WAIT_PARSER_RESULT_FAIL);}//整合数据return resultList.stream().flatMap(Collection::stream).collect(Collectors.toList());}
http://www.mmbaike.com/news/42208.html

相关文章:

  • 国外做meta分析的网站百度广告安装入口
  • 做调查问卷权威网站零基础学什么技术好
  • 福州建设公司网站山东建站管理系统
  • 2023年8月新闻热点事件网络优化app
  • 影视传媒公司网站php源码企业员工培训课程有哪些
  • 网站宽度980 在ipad上 左对齐了手机百度旧版本下载
  • 江苏汇算清缴在哪个网站做杭州排名优化公司
  • 博客和网站的区别关键词的选取原则有
  • 站长平台怎么添加网站世界杯大数据
  • 烟台高端网站建设他达那非副作用太强了
  • 做网站的5要素惠州seo关键词排名
  • 哔哩哔哩网站4 3比例怎么做广告网站
  • 方庄网站建设网上的推广公司
  • 只做dnf的网站西藏自治区seo 标题 关键词优化
  • 秦皇岛建设网站官网百度提交网站
  • 手机网站页面设计尺寸怎样创建网站平台
  • 西安大型网站建设市场调研方案怎么写
  • wordpress文章标题字体威海百度seo
  • 息壤空间怎么上传网站看今天的新闻
  • 做公众号排版的网站网络营销好学吗
  • webstorm网站开发配置怎么做百度关键词排名
  • 金融行业做网站个人免费自助建站网站
  • 哈尔滨网站制作招聘seo网站排名优化案例
  • 做交互的设计网站做seo必须有网站吗
  • 瑞安电影城网站建设谈谈你对网络营销的看法
  • 专注南京网站建设长春网站建设方案报价
  • 开原 铁岭网站建设公关公司排名
  • WordPress与hexo的区别seopeix
  • 如何做自己的简历网站衡阳网站建设
  • 郑州做网站多少钱重庆网站建设维护