根据清单 12.3 中的Java Concurrency in Practice一书,我们可以使用以下示例代码测试并发代码:
void testTakeBlocksWhenEmpty() {
final BoundedBuffer<Integer> bb = new BoundedBuffer<Integer>(10);
Thread taker = new Thread() {
public void run() {
try {
int unused = bb.take();
fail(); // if we get here, it’s an error
} catch (InterruptedException success) { }
}
};
try {
taker.start();
Thread.sleep(LOCKUP_DETECT_TIMEOUT);
taker.interrupt();
taker.join(LOCKUP_DETECT_TIMEOUT);
assertFalse(taker.isAlive());
} catch (Exception unexpected) {
fail();
}
}
假设执行了以下步骤:
taker
线程开始了。bb.take()
fail()
成功返回,我们只是在方法运行之前一点点。- 它被称为
interrupt()
方法。 - 我们在线程的
catch
块。taker
所以,我们现在处于 catch 块,但实际上测试方法失败了。它失败了,我们永远不会被告知。
这是正确的吗?如果是,我们如何解决这个问题?