在java executor框架中,我们要等到所有任务完成,我们有invokeAll()方法.But,而使用spring的ThreadPoolTaskExecutor时,我们只有submit方法,该方法在第一个任务完成后返回Future object.So,它将在下一个task.So中启动,如果我想等待所有任务完成,有什么方法可以做到吗?意思是在spring中有没有等同于invokeAll()的方法,如果我理解错了,请纠正我。
发布于 2016-11-14 18:15:59
您可以使用org.springframework.core.task.support.ExecutorServiceAdapter:包装TaskExecutor
ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(taskExecutor);
List<Future<V>> futures = adapter.invokeAll(tasks);希望能有所帮助。
发布于 2016-11-14 22:00:31
总是不及格的ThreadPoolTaskExecutor源代码让我很愚蠢。你让我想起了ExecutorServiceAdapter是否属于春天。现在我认为是,这是我的代码来回答你的问题,希望没有错。
ThreadPoolTaskExecutor threadPool = atx.getBean("threadPool", ThreadPoolTaskExecutor.class);
ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(threadPool);
List<Callable<Integer>> tasks = new ArrayList<>();
Callable<Integer> task = null;
for (int i = 0; i < 10; i++){
task = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int time = new Random().nextInt(1000);
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + " has slept " + time);
return time;
}
};
//submit task and wait to execute
threadPool.submit(task);
//add all task to list
tasks.add(task);
}
//get the start time of all threads
long start = System.currentTimeMillis();
try {
List<Future<Integer>> result = adapter.invokeAll(tasks);
for (int i = 0; i < result.size(); i++){
System.out.println(result.get(i).get());
}
} catch (ExecutionException ex){
ex.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Total time is " + (System.currentTimeMillis() - start));发布于 2020-10-29 07:22:17
最简单的方法
taskExecutor.getThreadPoolExecutor().invokeAll(callables);https://stackoverflow.com/questions/40584139
复制相似问题