今天在用单元测试测试多线程,遇到一个诡异的问题,两段一模一样的代码,一个用单测调用,一个用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......