线程池幽灵般的错误
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、效果如下: