在线程池中寻找堆栈

2019-06-01  本文已影响0人  12点前睡觉hhh

首先看一个简单的案例,代码如下

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);
            });
        }
    }
}

结果如下:



本来应该有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);
            });
        }
    }
}

结果如下:


image.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();
        }
    }
}

结果如下:


image.png
上一篇 下一篇

猜你喜欢

热点阅读