求JAVA任务数拆分代码

ddatsh 发布于 2015/12/21 20:09
阅读 666
收藏 1

求段优雅的代码

Executors.newFixedThreadPool(XX);
开指定个数线程池,执行某方法 generateXX(),生成结果

放至容器或map之类,每满N个,调用另一方法,传入这N个生成的东西


加载中
0
h
hao5ang

CompletionService: 当任务执行完时,将结果放到一个blockqueue里面. 自己定义Executor的policy,防止内存溢出等.

Executor e = Executors.newFixedThreadPool(XX);
CompletionService<Result> ecs
         = new ExecutorCompletionService<Result>(e);
for (Callable<Result> s : tasks)
         ecs.submit(s);
List<Result> list = new ArrayList(N);
for (int i = 0; i < tasks.size(); ++i) {
	Result r = ecs.take().get();
	list.add(r);
	if(list.size() >= N){
		submitBatch(list);
		list = new ArrayList(N);
	}
}
submitBatch(list);



whaon
whaon
正解
0
ddatsh
ddatsh
下面取任务的没疑问,一次取出N个批量调submitBatch一次
BlockingQueue<Future<Triplet<Integer,String, String>>> queue = new LinkedBlockingDeque<>(10);
ExecutorService es =Executors.newFixedThreadPool(10);
CompletionService<Result> ecs= new ExecutorCompletionService<>(es,queue);

CompletionService 内部还是类似队列去保存任务?一下就放1亿,2亿个,就直接OOM了?  放的时候如何支持大批量任务呢?

Kevin_Zhan
Kevin_Zhan
回复 @hao5ang :
h
hao5ang
CompletionService 只是对Executor做了一个包装, 实现了任务完成以后, 放到一个阻塞队列的功能. 最终执行的还是 Executor. Executors 实现了很方便的创建线程方法, 但是不够灵活, 很容易出现内存溢出等问题. 你可以搜一下 ThreadPoolExecutor.
返回顶部
顶部