ブックJava Concurrency in Practice at Listing 12.3 によると、次のサンプル コードを使用して並行コードをテストできます。
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 ブロックにいますが、実際にはテスト メソッドは失敗しています。それは失敗し、通知されることはありません。
これは正しいですか?はいの場合、どうすればこれを修正できますか?