jUnit 4 如何设法通过超时中断不间断的死锁测试以及为什么 jUnit 5 不能这样做?

问题描述

如果我错了,请纠正我,但据我所知,没有办法不间断地中断等待锁定的 Java 线程。我有以下模拟死锁的测试

public void deadLockTimeouttest() {
    CyclicBarrier barrier = new CyclicBarrier(2);
    Thread t1 = new Thread(() -> {
        l1.lock();
        try {
            barrier.await();
        } catch (InterruptedException | brokenBarrierException e) {
            throw new RuntimeException(e);
        }
        try {
            l2.lock();
            try {
                System.out.println("t1 succeeded");
            } finally {
                l2.unlock();
            }
        } finally {
            l1.unlock();
        }
    });

    t1.start();

    l2.lock();
    try {
        barrier.await();
    } catch (InterruptedException | brokenBarrierException e) {
        throw new RuntimeException(e);
    }
    try {
        l1.lock();
        try {
            System.out.println("main thread succeeded");
        } finally {
            l1.unlock();
        }
    } finally {
        l2.unlock();
    }
}

如果我使用 jUnit 4 @Test(timeout = 1_000L) 运行它,测试会被中断,而预期不会这样做:

java.lang.Exception: 1000 毫秒后测试超时

现在如果我用 jUnit 5 运行相同的测试

@Test
@Timeout(1)

它只是卡在了预期的地方(两个线程都试图不间断地获取第二个锁)。并且 jUnit 不会在 1 秒内失败。以我对不间断 .lock() 的了解,这在意料之中。但是既然 jUnit 4 以某种方式设法通过了测试,为什么 jUnit 5 没有这样做呢?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)