今天在用单元测试测试多线程,遇到一个诡异的问题,两段一模一样的代码,一个用单测调用,一个用main 方法调用,结果却不一样
@Test public void mainTest() { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(4, 8, 5L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 0; i < 10; i++) { threadPoolExecutor.execute(() -> macklack()); } } public static void main(String[] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(4, 8, 5L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 0; i < 10; i++) { threadPoolExecutor.execute(() -> macklack()); } } private static void macklack() { System.out.println("west"); try { Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("east"); }
单测调用在使用了 Thread.sleep(3000);后面码中断了,没有执行,尝试了各种写法后,最后用了public static void main(String[] args) main方法来调用,main方法调用后又是正常的,是我又一次陷入了沉思。又经过n次尝试后。于是去网上搜索了一下
原来在单元测试中,如果子线程处于阻塞、死亡状态时,单元测试会立刻停止所有子线程,同时退出程序!emo......