【Java】并行执行任务
在实际的应用上,我们平时需要调用第三方的接口,可能会调用多个接口,串行执行的话,
就需要等待所有的接口调用完成之后才获取到结果,那我们有没有并行的方法的呢?
串行执行
以下是三个接口,假设他们额的执行耗时,分别为1S,2S和3S ,串行执行的话,需要等待6S才可得到返回的结果。
public static void intf() {
// 模拟执行耗时
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("接口1");
}
public static void intf2() {
// 模拟执行耗时
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("接口2");
}
public static void intf3() {
// 模拟执行耗时
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("接口3");
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
intf();
intf2();
intf3();
long endTime = System.currentTimeMillis();
System.out.println("代码段执行时间:" + (endTime - startTime) + "ms");
}
执行耗时
接口1
接口2
接口3
代码段执行时间:6048ms
并行执行
CountDownLatch
public static void getIntfResult() {
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(3);
executorService.execute(new Runnable() {
@Override
public void run() {
intf();
latch.countDown();
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
intf2();
latch.countDown();
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
intf3();
latch.countDown();
}
});
try {
// 一定记得加上timeout时间,防止阻塞主线程
latch.await(3000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
//4.等待所有子任务完成,组装活动标签信息
//5.关闭线程池
executorService.shutdown();
}
执行耗时
接口1
接口2
接口3
代码段执行时间:3009ms
ExecutorService.invokeAll
public static void getIntfResultByInvokeAll(){
ExecutorService executorService = Executors.newCachedThreadPool();
List<Callable<String>> tasks = new ArrayList();
tasks.add(new Callable<String>() {
@Override
public String call() throws Exception {
intf();
return null;
}
});
tasks.add(new Callable<String>() {
@Override
public String call() throws Exception {
intf2();
return null;
}
});
tasks.add(new Callable<String>() {
@Override
public String call() throws Exception {
intf3();
return null;
}
});
try {
List<Future<String>> futureList = executorService.invokeAll(tasks, 3000, TimeUnit.MILLISECONDS);
for (Future<String> future : futureList) {
// 获取线程执行结果
try {
String activityTag = future.get();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭线程池
executorService.shutdown();
}
执行耗时
接口1
接口2
接口3
代码段执行时间:3020ms
CompletableFuture
public static void getIntfResultByFuture() {
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> intf());
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> intf2());
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> intf3());
try {
//获取并行执行任务结果
System.out.println(future3.get());
System.out.println(future1.get());
System.out.println(future2.get());
} catch (Exception e) {
}
}
执行耗时
接口1
接口2
接口3
代码段执行时间:3154ms
【Java】并行执行任务的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java使用Fork/Join框架来并行执行任务
现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...
- Java中使用ThreadPoolExecutor并行执行独立的单线程任务
Java SE 5.0中引入了任务执行框架,这是简化多线程程序设计开发的一大进步.使用这个框架可以方便地管理任务:管理任务的生命周期以及执行策略. 在这篇文章中,我们通过一个简单的例子来展现这个框架所 ...
- 一个用于实现并行执行的 Java actor 库
即使 Java 6 和 Java 7 中引入并发性更新,Java 语言仍然无法让并行编程变得特别容易.Java 线程.synchronized 代码块.wait/notify 和java.util.c ...
- 我的Java开发学习之旅------>Java使用Fork/Join框架来并行执行任务
现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- Core Java 总结(关键字,特性问题)
2016-10-19 说说&和&&的区别 初级问题,但是还是加入了笔记,因为得满分不容易. &和&&都可以用作逻辑与的运算(两边是boolean类型), ...
- Java核心技术点之多线程
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:279558494 我们一起学Java! 本文主要从整体上介绍Java中的多线程技术, ...
- java多线程实现方式
一.什么是线程? 线程:程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位. 多线程:单个程序中同时运行多个线程完成不同的工作,称为多线程. 特 ...
随机推荐
- day47:Bootstrap
什么是Bootstrap? Bootstrap是一个开源框架,是对html\css\js\jquery等的封装,用法,复制黏贴一把梭. 关于Bootstrap的一些常用网址 网址: https://w ...
- 最好用的.NET敏捷开发框架-RDIFramework.NET V3.6版全新发布 100%源码授权
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...
- Kubernetes入门实践(环境搭建)
容器技术只是解决了运维部署工作中的一个很小的问题,在现实生产环境中,除了最基本的安装,还会各式各样的需求,比如服务发现.负载均衡.状态监控.健康检查.扩容缩容.应用迁移.高可用等等.这些容器之上的管理 ...
- 探究公众号接口漏洞:从后台登录口到旁站getshell
探究公众号接口漏洞:从后台登录口到旁站getshell 1.入口 发现与利用公众号接口安全漏洞 某120公众号提供了一处考核平台,通过浏览器处打开该网站. 打开可以看到一处密码登录口,试了一下常用的手 ...
- day03-商家查询缓存02
功能02-商铺查询缓存02 知识补充 (1)缓存穿透 https://blog.csdn.net/qq_45637260/article/details/125866738 缓存穿透(cache pe ...
- Django笔记三十之log日志记录详解
本文首发于公众号:Hunter后端 原文链接:Django笔记三十之log日志的记录详解 这一节介绍在 Django 系统里使用 logging 记录日志 以下是一个简单的 logging 模块示例, ...
- Ajax 以及 Ajax基于Promise封装
AJAX - 创建 XMLHttpRequest 对象 var xmlhttp = new XMLHttpRequest(); 通过打印实例对象我们发现,我们打印的是 xmlhttp 对象,里面所有的 ...
- win系统安装wordcloud报错解决方案
问题: ① 在命令行下执行pip install wordcloud出现报错如图: ②下载了错误的whl文件, 出现wordcloud-1.4.1-cp27-cp27m-win_amd64.whl i ...
- 如何实现一个sync.Once
sync.Once 是 golang里用来实现单例的同步原语.Once 常常用来初始化单例资源, 或者并发访问只需初始化一次的共享资源,或者在测试的时候初始化一次测试资源. 单例,就是某个资源或者对象 ...
- ad-hoc实战
ad-hoc实战 要求:利用Ansible搭建一个简易的作业网站,web端文件上传目录共享至nfs端,nfs的数据同步至backup 环境准备 主机名 主机角色 外网IP 内网IP m01 ansib ...