通过Callable,Future实现十亿数据的并行相加
来源:互联网 发布:软件项目总结 编辑:程序博客网 时间:2024/05/22 11:46
在java线程中,Runables接口的run方法不提供返回值,因此无法用来进行并发执行
但有一个ExecutorCompletionService可以异步提交submit(task(Callable)),
ExecutorCompletionService对Callable生成FutureTask,FutureTask完成时会执行done操作,
然后ExecutorCompletionService中得线程池executor执行task的内容并得到对应的结果放入BlockingQueue<Future>
ExecutorCompletionService进行take操作从BlockingQueue堵塞获取结果,直至所有线程的结果全部返回则将结果进行计算并返回
package com.test.concurrencalc;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CalcBillionsIntAddInFuture {
public final static long MAX_NUM = 100000000000l;
public final static int CPUS = Runtime.getRuntime().availableProcessors();
private final ExecutorService executor;
private final ExecutorCompletionService<Long> ecs;
privatefinal long maxValue;
public CalcBillionsIntAddInFuture(longmaxValue) {
// TODO Auto-generated constructor stub
executor = Executors.newFixedThreadPool(CPUS);
ecs = new ExecutorCompletionService<>(executor);
this.maxValue =maxValue;
}
private class CalcIntAddTask implements Callable<Long>{
privatefinal int i;
public CalcIntAddTask(inti) {
// TODO Auto-generated constructor stub
this.i =i;
}
@Override
public Long call()throws Exception {
// TODO Auto-generated method stub
long res = 0;
for(longv=maxValue/CPUS*i+1;v<=maxValue/CPUS*(i+1);v++){
res += v;
}
returnres;
}
}
public void calcIntValues(){
for(inti=0;i<CPUS;i++){
ecs.submit(new CalcIntAddTask(i));
}
long res = 0;
Future<Long> future =null;
for(inti=0;i<CPUS;i++){
try {
future = ecs.take();
res += future.get();
} catch (InterruptedExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
executor.shutdown();
System.out.println("res:" +res);
}
public static void main(String[] args) {
CalcBillionsIntAddInFuture calcBillionsIntAddInFuture = new CalcBillionsIntAddInFuture(MAX_NUM);
long start = System.currentTimeMillis();
calcBillionsIntAddInFuture.calcIntValues();
System.out.println("method in Future calc time:"+(System.currentTimeMillis() -start));
start = System.currentTimeMillis();
long res = 0;
for(longi=1;i<=MAX_NUM;i++){
res += i;
}
System.out.println("res:"+res);
System.out.println("method2 calc time:"+(System.currentTimeMillis() -start));
}
}
- 通过Callable,Future实现十亿数据的并行相加
- Callable和Future的线程实现
- callable&future的使用
- Callable和Future实现调用任务并返回结果数据
- Callable和Future实现调用任务并返回结果数据
- Java多线程之Callable和Future接口的实现
- Java并发编程:Callable、Future和FutureTask的实现
- C++如何通过栈实现超大整型数据的相加
- Callable与Future的应用
- Callable 和 Future 的试用
- Callable与Future的介绍
- Callable与Future的介绍
- Callable与Future的介绍
- Callable与Future的介绍
- Callable与Future的介绍
- Callable与Future的介绍
- Callable与Future的介绍
- Callable与Future的介绍
- 注意Javascript数据类型
- 史上最详细的JavaScript事件使用指南
- 使用Socket发送接收HTTP请求(JAVA)
- 转TextView的一些高级显示,谢谢
- VIM常用命令学习
- 通过Callable,Future实现十亿数据的并行相加
- 5月记-电面、学习、考试、纠结
- 28.数据存储 plist 偏好设置 归档
- centos下部署ngnix和php
- Jersey+EclipseJavaEE+Apache-Tomcat8 开发Rest服务
- Apache Thrift - 可伸缩的跨语言服务开发框架
- 几种单例模式的使用及比较
- linux下jvm 参数调优
- rpmreaper和rpmorphan简介