代码改变世界

线程池幽灵般的错误

2022-05-20 15:34  通往神之路  阅读(21)  评论(0编辑  收藏  举报

1、准备一个任务,计算两个数的商;

/**
 * 线程池,吃掉程序抛出的异常
 *
 * @author 八戒乡建 Team
 * @version 9.0
 */
public class DivTask  implements  Runnable{
    int a,b;
    public DivTask (int a,int b){
        this.a=a;
        this.b=b;
    }
    @Override
    public void run() {
        double re=a/b;
        System.out.println(re);
    }
}

2、使用线程池执行该任务;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) {
        ThreadPoolExecutor pools = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        //5次循环,理论上会得到5个输出;
        //结果只得到4个输出,而且没有报错,为什么呢?这里很好看出来,但是复杂的计算逻辑呢?
        for (int i = 0; i < 5; i++) {
            pools.submit(new DivTask(100,i));
        }
    }
}

3、执行结果如下:

 4、一种最简单的方法就是放弃submit()方法,改用execute()方法

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) {
        ThreadPoolExecutor pools = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        //5次循环,理论上会得到5个输出;
        //结果只得到4个输出,而且没有报错,为什么呢?这里很好看出来,但是复杂的计算逻辑呢?
        for (int i = 0; i < 5; i++) {
            //一种最简单的方法就是放弃submit()方法,改用execute()方法
            //pools.submit(new DivTask(100,i));
            pools.execute(new DivTask(100,i));
        }
    }
}

5、效果如下: