【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的基本单位. 多线程:单个程序中同时运行多个线程完成不同的工作,称为多线程. 特 ...
随机推荐
- windows如何拉取一个文件夹下的所有文件名
问题描述:遇到一个问题,是说一个文件夹下的文件太多了,如何去批量的拉去文件名呢,今天用CMD+DIR的方式拉取 1.文件目录也很深,就从文件导航栏进入CMD窗口 2.在当前目录中输入cmd,然后回车 ...
- 数据泵:19c PDB数据泵迁入
1.问题描述 用数据泵进行pdb的迁入迁出,模拟测试将其他库的数据导入到19cpdb中 2.环境介绍 source:12.2.0.1.0 target:19.0.0.0.0 3.源端制造数据 创建表空 ...
- Go语言网络编程:SSH连接
旨在提升Go语言网络编程能力 SSH是什么? SSH 为 Secure Shell 的缩写,为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SS ...
- Tmux 使用教程
本文转载自阮一峰老师的博客文章<Tmux 使用教程>,感谢阮老师! Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 ...
- ASP.NET Core - 缓存之分布式缓存
分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...
- 没有杯子的世界:OOP设计思想的应用实践
最近看到一个有趣的问题:Person类具有Hand,Hand可以操作杯子Cup,但是在石器时代是没有杯子的,这个问题用编程怎么解决? 简单代码实现 我们先用简单代码实现原问题: @Data publi ...
- 【Redis】-使用Lua脚本解决多线程下的超卖问题以及为什么?
一.多线程下引起的超卖问题呈现1.1.我先初始化库存数量为1.订单数量为0 1.2.开启3个线程去执行业务 业务为:判断如果说库存数量大于0,则库存减1,订单数量加1 结果为:库存为-2,订单数量为3 ...
- #Python 利用pivot_table,数据透视表进行数据分析
前面我们分享了,利用python进行数据合并和连接,但是工作中,我们往往需要对数据进一步的聚合或者运算,以求最后的数据结果. 今天我们就来学习一下利用pandas模块,对数据集进行数据透视分析. pi ...
- sh: vue-cli-service: command not found
mac环境下运行vue项目报错sh: vue-cli-service: command not found 解决方法:cd到项目目录下,执行命令sudo rm -rf node_modules pac ...
- 2022-06-13:golang中,[]byte和结构体如何相互转换?
2022-06-13:golang中,[]byte和结构体如何相互转换? 答案2022-06-13: []byte和结构体的转换的应用场景是数据解析. 代码里有两种方法,一种是内存不共用,另一种是内存 ...