首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spring executor中java executor框架的invokeAll等价方法

spring executor中java executor框架的invokeAll等价方法
EN

Stack Overflow用户
提问于 2016-11-14 15:57:02
回答 4查看 1.6K关注 0票数 3

在java executor框架中,我们要等到所有任务完成,我们有invokeAll()方法.But,而使用spring的ThreadPoolTaskExecutor时,我们只有submit方法,该方法在第一个任务完成后返回Future object.So,它将在下一个task.So中启动,如果我想等待所有任务完成,有什么方法可以做到吗?意思是在spring中有没有等同于invokeAll()的方法,如果我理解错了,请纠正我。

EN

回答 4

Stack Overflow用户

发布于 2016-11-14 18:15:59

您可以使用org.springframework.core.task.support.ExecutorServiceAdapter:包装TaskExecutor

代码语言:javascript
运行
复制
ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(taskExecutor);

List<Future<V>> futures = adapter.invokeAll(tasks);

希望能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-11-14 22:00:31

总是不及格的ThreadPoolTaskExecutor源代码让我很愚蠢。你让我想起了ExecutorServiceAdapter是否属于春天。现在我认为是,这是我的代码来回答你的问题,希望没有错。

代码语言:javascript
运行
复制
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));
票数 1
EN

Stack Overflow用户

发布于 2020-10-29 07:22:17

最简单的方法

代码语言:javascript
运行
复制
taskExecutor.getThreadPoolExecutor().invokeAll(callables);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40584139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档