ExecutorService.invokeAll(超时了,为什么没有异常,还正常获取结果呢?

最近在学习JVM中的并发库,concurrent包下的类,demo如下,已经超时了,不知道为什么没有异常抛出,反而正常获取到了结果,按照并发书中所述,此方法运行时应该抛出异常才对,请大家帮忙查看一下,谢谢!


import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * invokeAll(Collection tasks, long timeout, TimeUnit unit)
 *
 * @author xiaoshu
 */
public class Run {
    public static void main(String[] args) {
        try {
            MyCallableA a = new MyCallableA();
            MyCallableB b = new MyCallableB();

            List<Callable<String>> list = new ArrayList<>();
            list.add(a);
            list.add(b);

            ExecutorService executorService = Executors.newCachedThreadPool();
            System.out.println("X " + LocalDateTime.now());
            List<Future<String>> futures = executorService.invokeAll(list, 2, TimeUnit.SECONDS);
            System.out.println("Y " + LocalDateTime.now());
            for (int i = 0; i < futures.size(); i++) {
                System.out.println(futures.get(i).get());
            }
            System.out.println("Z " + LocalDateTime.now());
        } catch (InterruptedException e) {
            System.out.println("进入catch InterruptedException");
            e.printStackTrace();
        } catch (ExecutionException e) {
            System.out.println("进入catch ExecutionException");
            e.printStackTrace();
        }
    }
}


class MyCallableB implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("MyCallableB begin " + LocalDateTime.now());
        for (int i = 0; i < 10; i++) {
            Math.random();
            Math.random();
            Math.random();
        }
        System.out.println("MyCallableB end " + LocalDateTime.now());
        return "MyCallableBValue";
    }
}

class MyCallableA implements Callable<String> {
    @Override
    public String call() throws Exception{
        System.out.println("MyCallableA begin " + LocalDateTime.now());
        for (int i = 0; i < 223456666; i++) {
            Math.random();
            Math.random();
            Math.random();
        }
        System.out.println("MyCallableA end " + LocalDateTime.now());
        return "MyCallableAValue";
    }
}

输出结果:
clipboard.png

阅读 5.4k
2 个回答
Executes the given tasks, returning a list of Futures holding their status and results when all complete or the timeout expires, whichever happens first.
链接描述

是否超时应该 是以先执行的任务的完成时间为准。

会抛出异常,java.util.concurrent.CancellationException
如果某项值生成任务(如 FutureTask)的结果因为任务被取消而无法获取到,则抛出该异常

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题