当前位置:网站首页>用Future与CountDownLatch实现多线程执行多个异步任务,任务全部完成后返回结果
用Future与CountDownLatch实现多线程执行多个异步任务,任务全部完成后返回结果
2022-04-23 06:00:00 【0oIronhide】
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/** * 用Future与CountDownLatch实现多线程执行多个异步任务,任务全部完成后返回结果 */
public class TestFuture {
public static void main(String[] args) {
TestFuture testFuture = new TestFuture();
// 初始为三个任务数
int taskCount = 3;
List<Future<String>> futures = new ArrayList<>(taskCount);
// CountDownLatch作为递减计数器,一个线程完成了一个任务,计数器减一,减为0时表示任务全部完成
CountDownLatch downLatch = new CountDownLatch(taskCount);
ExecutorService executorService = new ThreadPoolExecutor
(taskCount, 5, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
for (int i = 0; i < taskCount; i++) {
// 开启三个异步任务
Future<String> future = executorService.submit(testFuture.executeTask(i, downLatch));
futures.add(future);
}
System.out.println("do other things");
try {
// 在downLatch不为0时,主线程会在此阻塞
downLatch.await();
executorService.shutdown();
// 通过future获取结果
List<String> result = testFuture.getFutureResult(futures);
for (String s : result) {
System.out.println(s);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public Callable<String> executeTask(int i, CountDownLatch downLatch) {
return () -> {
Thread.sleep(i * 1000L);
downLatch.countDown();
return "Result " + Thread.currentThread().getName();
};
}
public List<String> getFutureResult(List<Future<String>> futures) {
List<String> result = new ArrayList<>(3);
for (Future<String> future : futures) {
if (future.isDone() && !future.isCancelled()) {
try {
result.add(future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
return result;
}
}
版权声明
本文为[0oIronhide]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_38599840/article/details/120708245
边栏推荐
猜你喜欢
随机推荐
TypeScript(下)
el-cascader和el-select点击别处让下拉框消失
[OSS file upload quick start]
Leetcode integer plus one
el-date-picker限制选择范围,从当前时间到两个月前
JS handwriting compatibility event binding
【代码解析(5)】Communication-Efficient Learning of Deep Networks from Decentralized Data
memcached 源码分析
redis 实践笔记和源码分析
初步认识Promse
SQL学习|复杂查询
模仿扇贝短文阅读页面
【OSS文件上传快速入门】
【MySQL基础篇】启动选项与配置文件
window环境下使用小皮面板安装redis
EF CORE在ASP.NET CORE项目中基于数据库优先模式生成实体模型
Decentralized Collaborative Learning Framework for Next POI Recommendation
端口占用1
【代码解析(7)】Communication-Efficient Learning of Deep Networks from Decentralized Data
mysql中sum (if)_mysql 中sum (if())