Что такое хороший пример программы для демонстрации неправильной обработки InterruptedException, брошенного потоком.спать ()?


Я читал о InterruptedException, и сразу видно, что нет никакого решения серебряной пули, чтобы справиться с ним должным образом во всех случаях.

Чего я еще не видел, так это некоторого примера кода, демонстрирующего, что может пойти не так, если исключение обрабатывается неправильно. Конечно, я понимаю, что некоторые эффекты (например, голодание нитей, которое я считаю одним из них) трудно продемонстрировать. Я хочу ограничить его демонстрацией правильного использования Thread.sleep().

Как бы вы подошли к разработке несколько реалистичного образца программы для этого?

Вот мои идеи до сих пор:

  1. Сделайте простое приложение с графическим интерфейсом, чтобы продемонстрировать пониженную отзывчивость. там будет поток пользовательского интерфейса и простой пул потоков для выполнения некоторой задачи блокировки. Диспетчер пула потоков проверяет состояние прерванных запущенных потоков, чтобы управлять ими. Проглоченные InterruptedExceptions приводят к тому, что в пуле заканчиваются потоки, поэтому приложение становится менее отзывчивая.

    Это может помочь указать на различные стратегии обработки при спящем режиме в управляемом потоке и неуправляемом потоке.

  2. Есть куча нитей, которые создают мусор и спят.Существует два типа потоков: те, которые восстанавливают прерванное состояние при прерывании, и те, которые этого не делают (проглатывают исключение). Тогда демонстрация состояла бы в том, чтобы запустить приложение в JVM с небольшим объемом памяти и (надеюсь) показать, что проглатывание исключение каким-то образом тормозит сборку мусора или увеличивает ее накладные расходы (из-за большого интервала между вызовами).

Имеют ли эти идеи смысл? Какие-нибудь другие (может быть, более простые) идеи?
1 3

1 ответ:

Предположим, у вас есть поток, который вы хотите отключить, прервав его.

public void run() {
   while(!Thread.currentThread().interrupted()) {
       doWork();     
       callMethodWhichIgnoresInterrupted();
   }
}

Отбрасывая прерывание, вы можете получить поток, который иногда не может умереть, вызывая утечку ресурсов, которую вы не можете исправить без перезапуска приложения.

Игнорировать любое исключение-очень плохая идея в 95% случаев. Вот почему они являются проверяемыми исключениями в Java. Эти проблемы не ограничиваются прерываниями.