java单元测试多线程测试中使用sleep()导致程序直接退出问题
问题描述:最近在复习JUC的时候碰到一个神奇的bug,由于本人喜欢经常在单元测试( @Test )中测试代码,然后碰到如下代码时发现程序并不会sleep就直接结束退出了。。。经过查阅之后才发现这是单元测试的机制问题:
在单元测试中,如果子线程处于阻塞、死亡状态时,单元测试会立刻停止所有子线程,同时退出程序!
我们来看看代码:
class Demo {
Lock lock = new ReentrantLock();
public void A() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " --> A");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
System.out.println("A释放。。。");
}
}
public void B() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " --> B");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
System.out.println("B释放。。。");
}
}
}
(1)在单元测试:
@Test
public void test02() {
Demo demo = new Demo();
new Thread(() -> {
demo.A();
}, "Thread1").start();
new Thread(() -> {
demo.B();
}, "Thread2").start();
}
结果(很无语,根本没sleep就直接结束退出了):
(2)在main测试:
public class JucApplication {
public static void main(String[] args) {
Demo demo = new Demo();
new Thread(() -> {
demo.A();
}, "Thread1").start();
new Thread(() -> {
demo.B();
}, "Thread2").start();
}
}
结果:
可以发现,在main测试是正常的结果。。。。。。
所以建议不要在单元测试中测试多线程!!!