场景
在使用 JUnit 单元测试对多线程测试时子线程没有执行,测试非多线程问题则可以正常执行。文章来源:https://www.toymoban.com/news/detail-574237.html
原因
JUnit 运行时会在主线程直接完成后调用 System.exit 退出,不会等待各个线程运行结束。文章来源地址https://www.toymoban.com/news/detail-574237.html
解决方案
死循环
@Test
public void demo() {
int threadNum = 10;
// 初始化线程池
ExecutorService executorService = new ThreadPoolExecutor(threadNum,// 核心线程池大小
100,// 最大线程池大小
60L,// 线程最大空闲时间;线程空闲60s后自动结束
TimeUnit.MILLISECONDS,// 时间单位
new LinkedBlockingQueue<Runnable>()// 线程等待队列
);
for (int i = 1; i <= threadNum; i++) {
executorService.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
});
}
while (true) {
}
}
计数器(CountDownLatch)
@Test
public void demo() {
int threadNum = 10;
// 初始化线程池
ExecutorService executorService = new ThreadPoolExecutor(threadNum,// 核心线程池大小
100,// 最大线程池大小
60L,// 线程最大空闲时间;线程空闲60s后自动结束
TimeUnit.MILLISECONDS,// 时间单位
new LinkedBlockingQueue<Runnable>()// 线程等待队列
);
CountDownLatch countDownlatch = new CountDownLatch(threadNum);//使用计数器
for (int i = 1; i <= threadNum; i++) {
executorService.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
// 每次计数减一,很关键, 否则await无法释放
countDownlatch.countDown();
});
}
try {
// 当计数为0时结束阻塞,所有线程countDown()都执行之后才会释放当前线程,程序才能继续往后执行
countDownlatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭线程池
executorService.shutdown();
}
到了这里,关于JUnit 单元测试多线程测试解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!