Согласно книге Java Параллелизм на практике в листинге 12.3 мы могли протестировать параллельный код, используя следующий код:Тестирование параллелизм в Java
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 на данный момент, но на самом деле метод проверки не прошел. Это не удается, и мы никогда не информированы.
Это право? Если да, то как мы можем это исправить?
Никогда не видел структуру данных BoundedBuffer ранее в Java. Что делает функция()? Пожалуйста, предоставьте несколько ссылок. –
«Thread.sleep» будет близок к уверенности в том, что если 'take'does не блокируется, метод' fail' будет вызываться до того, как поток будет прерван. И вообще: прерывание просто устанавливает флаг. Вам нужно будет заблокировать, чтобы исключение было выбрано. – Fildor
@Fildor: Допустим, что 'LOCKUP_DETECT_TIMEOUT' недостаточно. Должен ли я увеличить этот раз? Правильно ли это, или я должен что-то изменить в коде? – LiTTle