Какой хороший пример программы демонстрирует неправильную обработку InterruptedException, созданного Thread.sleep ()? - PullRequest
3 голосов
/ 08 февраля 2011

Я читал о InterruptedException, и сразу стало ясно, что не существует решения «серебряной пули» для правильной обработки во всех случаях.

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

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

Вот мои идеи на данный момент:

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

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

  2. Имеют несколько потоков, которые создают мусор и спят. Было бы два типа потоков: те, которые восстанавливают прерванное состояние при прерывании, и те, которые нет (проглотить исключение).Затем демонстрация будет состоять в том, чтобы запустить приложение в JVM с небольшим объемом памяти, и (мы надеемся) показать, что проглатывание исключения каким-то образом блокирует сборку мусора или увеличивает его издержки (из-за большого интервала между вызовами).*

    Имеют ли эти идеи смысл?Любые другие (возможно, более простые) идеи?

1 Ответ

4 голосов
/ 08 февраля 2011

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

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

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

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

...