首先看一个简单的案例,代码如下
public class FindStackDemo {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(5);
for (int i=0;i<5;i++){
int finalI = i;
es.submit(()->{
System.out.println(100/ finalI);
});
}
}
}
结果如下:
![](https://img.haomeiwen.com/i18077278/051c818fc0832f18.png)
本来应该有5个结果,但是却只得到了4个,这是由于当i取0时,100/0抛异常,所以没有打印结果,但是程序没有任何日志显示。
线程池很有可能会“吃”掉程序抛出的异常,导致我们对错误一无所知。
向线程池讨回异常的方法:
一是放弃使用submit方法,改用execute方法。
代码如下
public class FindStackDemo {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(5);
for (int i=0;i<5;i++){
int finalI = i;
es.execute(()->{
System.out.println(100/ finalI);
});
}
}
}
结果如下:
![](https://img.haomeiwen.com/i18077278/421ca43b382bc03a.png)
二是改造submit方法
public class FindStackDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(5);
for (int i=0;i<5;i++){
int finalI = i;
Future re = es.submit(() -> {
System.out.println(100 / finalI);
});
re.get();
}
}
}
结果如下:
![](https://img.haomeiwen.com/i18077278/c1a18cb709399e37.png)
网友评论