Расширить поток, чтобы проверить правильность завершения с помощью соединения? - PullRequest
0 голосов
/ 16 ноября 2018

Java-параллелизм на практике, 12.1.2.Тестирование операций блокировки:

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();
 }
}

Это один из немногих случаев, когда уместно явно создавать подкласс Thread, а не использовать Runnable в пуле: для проверки правильности завершения с помощью join.Тот же самый подход можно использовать для проверки того, что поток-получатель разблокируется после того, как элемент помещен в очередь главным потоком.

Но я не вижу, как расширение Thread помогает в этом тестировании.Для меня кажется, что такой же тест можно было бы сделать с передачей от Runnable до Thread.Кто-нибудь может это объяснить?

1 Ответ

0 голосов
/ 18 ноября 2018

Это один из немногих случаев, когда уместно явно использовать подкласс Thread, а не использовать Runnable в пуле: для проверки правильности завершения с объединением.

Другими словами, этот подход позволяет вам прервать тестовый поток и присоединиться к нему, чтобы убедиться, что он был завершен правильно.Вы не можете обрабатывать потоки таким образом, если используете, например, - ThreadPoolExecutor class.

Кроме того, можно создать новый поток, инициируя его с помощью Runnable, например Thread taker = new Thread(() -> {...});.Помните, что книга была написана около 8 лет назад, и создание Runnable вместо подкласса Thread сделало бы этот пример немного длиннее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...