单元测试是不支持多线程的,因为当主线程结束以后,无论子线程结束与否,都会强制退出程序,主线程优先级最高,所以解决办法是先让子线程执行完,然后结束主线程,可以利用CountDown计数器来处理。
1.首先介绍一个CountDown类,这是一个多线程计数器,有以下方法:
CountDownLatch构造参数是int,表示当前等待的线程数量
2.错误实例
@Test
public void test243() throws InterruptedException {
User user = new User("小明", 18);
List users = new ArrayList<>();
users.add(user);
new Thread(new Runnable() {
@Override
public void run() {
try {
//睡眠5秒,更直观测试
Thread.sleep(5000);
System.out.println("多线程执行完成:"+ users.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
System.out.println("执行完成:"+ users.toString());
}
结果:
可以看到,主线程执行完,多线程根本没有执行
3.正确实例
@Test
public void test243() throws InterruptedException {
//定义一个线程计数器,表示当前线程数量为1
CountDownLatch countDownLatch = new CountDownLatch(1);
User user = new User("小明", 18);
List users = new ArrayList<>();
users.add(user);
new Thread(new Runnable() {
@Override
public void run() {
try {
//睡眠5秒,更直观测试
Thread.sleep(5000);
System.out.println("多线程执行完成:"+ users.toString());
//此方法表示减1
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
System.out.println("执行完成:"+ users.toString());
//此方法是阻塞,什么时候放开呢?当线程数量为0或者线程异常退出的时候
countDownLatch.await();
}
结果:
谢谢观看!



