美文网首页
在线程池中寻找堆栈

在线程池中寻找堆栈

作者: 12点前睡觉hhh | 来源:发表于2019-06-01 12:47 被阅读0次

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

    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

    相关文章

      网友评论

          本文标题:在线程池中寻找堆栈

          本文链接:https://www.haomeiwen.com/subject/avawtctx.html