在java executor框架中等到所有任务完成后我们有invokeAll
()方法。但是在使用spring ThreadPoolTaskExecutor
时我们只有提交返回Future对象的方法。所以在完成第一个任务之后任务它将开始下一个任务。所以如果我想等到所有任务完成有任何方法可以做到这一点?意味着春天是否有任何可用的方法等于invokeAll()
如果我的理解是错误的,请纠正我。
答案 0 :(得分:1)
您可以使用org.springframework.core.task.support.ExecutorServiceAdapter包装TaskExecutor:
ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(taskExecutor);
List<Future<V>> futures = adapter.invokeAll(tasks);
希望它有所帮助。
答案 1 :(得分:1)
总是失败进入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));
答案 2 :(得分:0)
不使用替代方法即可获得相同结果的另一种方法是使用for循环中的Submit。
这种方法帮助我实现了自己想做的事情。希望这会有所帮助。
List<Future<String>> list = new ArrayList<Future<String>>();
Callable<String> callable = new MyTask();
for(int i=0; i< 5; i++){
//submit Callable tasks to be executed by thread pool
Future<String> future = executor.submit(callable);
//add Future to the list, we can get return value using Future
list.add(future);
}
for(Future<String> future : list){
try {
//Here future.get() will wait for task to be completed.
//Hence small delay will come.
System.out.println(future.get());
}catch (Exception e){
}
}
答案 3 :(得分:0)
最简单的方法
taskExecutor.getThreadPoolExecutor().invokeAll(callables);