Java InterruptedException - я не совсем понимаю, что означает прерывание потока или почему - PullRequest
3 голосов
/ 11 марта 2012

Я получаю это исключение внутри синхронизированного блока, в котором я вызываю wait для того же объекта, с которым синхронизируюсь.Что означает прерывание потока в первую очередь?во-вторых, каковы нормальные сценарии, где это произойдет?какой-нибудь совет относительно того, что могло бы продолжаться или что я должен сделать?

Ответы [ 2 ]

3 голосов
/ 11 марта 2012

Что означает прерывание потока в первую очередь?

Это означает, что что-то вызвало Thread.interrupt() в объекте потока.Это устанавливает флаг interrupted в потоке и заставляет определенные вызовы метода завершаться с исключением.

Во-вторых, каковы нормальные сценарии, где это может произойти?

Обычно используется, когда второй поток хочет сообщить этому потоку, что он должен прекратить свою работуВызов может быть прямым или библиотечным методом.Например, ThreadPoolExecutor.shutdownNow() использует прерывания для (попытки) прекращения выполнения задач.

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

Любой совет относительно того, что может происходить или что я должен делать?

Посмотрите на то, что «контролирует» поток, который был прерван.

3 голосов
/ 11 марта 2012

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

...