【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的基本单位. 多线程:单个程序中同时运行多个线程完成不同的工作,称为多线程. 特 ...
随机推荐
- SELECT COUNT(*) 会造成全表扫描?回去等通知吧
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- Spring Boot 整合 xxl-job
官方文档:https://www.xuxueli.com/xxl-job/ XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线 ...
- Tmux 使用教程
本文转载自阮一峰老师的博客文章<Tmux 使用教程>,感谢阮老师! Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 ...
- UnrealEngine - 网络同步之连接篇
1 连接过程 - 握手 传统的 C/S 架构下,Client 和 Server 通常会建立一条抽象的 Connection,用来进行两端的通信. UE 的官方文档中提供了 Client 连接到 Ser ...
- Redis - 数据类型映射底层结构
简介 从数据类型上体现就是,同一个数据类型,在不同的情况下会使用不同的编码类型,底层所使用的的数据结构也不相同. 字符串对象 字符串对象的编码可以是 int.raw 和 embstr 三者之一. em ...
- Optional避免频繁判空的神器
1. 创建Optional //创建空的 Optional Optional<Object> optional = Optional.empty(); //创建非空的 Optional 如 ...
- PaddlePaddle-快速入门
PaddlePaddle-快速入门 终于进入到新手入门第四课啦~在最后一门课中我会给大家讲解如何快速入门PaddlePaddle,并让大家跑通一个小demo来熟悉PaddlePaddle的基本命令. ...
- MacOS 环境下 VSCode 的 C++ 环境搭建
编译器安装 编译器可以选择 Clang 或者 GCC,在 MacOS 上 Clang 的安装更为简单一些. Clang(推荐) 打开终端输入命令, clang -v 查看是否已经安装. 如果已经安装, ...
- 【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
问题描述 查看Java Storage SDK,想找一个 uploadWithResponse 的示例代码,但是通过全网搜索,结果没有任何有帮助的代码.使用最近ChatGPT来寻求答案,得到非常有格 ...
- C++ ATL + WTL 选择文件
1 #include "stdafx.h" 2 #include "CStringHelper.h" 3 #include "AFileEngine. ...