java~并行计算~Future和Callable实现大任务的并行处理
Callable
是一个泛型接口,也是一个FunctionalInterface
,即函数式接口,它可以使用在Lambda表达式上,即现在比较流行的函数式编程,其实java8之后,封装了好多函数式接口,今天说的Callable它是一个带有返回值的接口,它主要和Future一起使用,用在并行计算上;并行计算就是说,一个大任务,多个线程并发执行,这样可以缩减程序运行的时间,当然前提是你要保持线程的安全性。
大任务实现类
/**
* 干一件不好干的事,使用Callable接口,需要 FutureTask实现类的支持,用于接收运算结果.
*/
class DoWork implements Callable<Integer> {
/**
* 需要处理的对象集合,每个线程传递自己的对象.
*/
List<String> list;
public DoWork(List<String> list) {
this.list = list;
}
@Override
public Integer call() throws Exception {
for (String s : list) {
System.out.println(Thread.currentThread().getId() + ":" + s);
}
Thread.sleep(3000);
return 1;
}
}
主方法中拆分大对象,调用大任务方法
@GetMapping("/do-fast")
public void doFast() throws InterruptedException, ExecutionException {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ExecutorService executor = Executors.newFixedThreadPool(2);
List<Future<Integer>> results = executor.invokeAll(asList(
new DoWork(Arrays.asList("a","b")), new DoWork(Arrays.asList("c","d"))
));
executor.shutdown();
//合并结果
for (Future<Integer> result : results) {
System.out.println(result.get());
}
stopWatch.stop();
System.out.println(stopWatch.getLastTaskTimeMillis());
}
如果不使用并行计算,这两个方法执行应该是3秒+3秒=6秒,而使用了并行编程,它只有3秒左右
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2020-09-02 maven~生成spotbug文档
2020-09-02 spotbugs~lombok生成的Date属性引起的EI_EXPOSE_REP问题
2020-09-02 es~通过ElasticsearchTemplate进行聚合~Nested嵌套聚合
2019-09-02 jenkins-pipeline里使用docker命令
2016-09-02 Lind.DDD.Utils.HttpHelper里静态对象引出的Http超时问题
2011-09-02 点某个链接进网站,会发这个链接的会员加积分,实现方法(有时间限制)