最近在学习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";
}
}
输出结果:
是否超时应该 是以先执行的任务的完成时间为准。