java executor框架在spring executor中的invokeAll等效方法

时间:2016-11-14 07:57:02

标签: spring multithreading executor

在java executor框架中等到所有任务完成后我们有invokeAll()方法。但是在使用spring ThreadPoolTaskExecutor时我们只有提交返回Future对象的方法。所以在完成第一个任务之后任务它将开始下一个任务。所以如果我想等到所有任务完成有任何方法可以做到这一点?意味着春天是否有任何可用的方法等于invokeAll()如果我的理解是错误的,请纠正我。

4 个答案:

答案 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);