Почему InterruptedException является проверяемым исключением? [закрытый]


Это вопрос на старой Java, когда мы делали наши собственные потоки. Некоторые методы, такие как Thread.sleep(100), бросают InterruptedException, когда он прерывается другим потоком. Теперь, как я понимаю, прерывание означает, что другая нить говорит: Позвольте мне взять на себя сейчас.

Когда это происходит, почему Java хочет, чтобы мы имели дело с InterruptedException?

Программисту даже не нужно беспокоиться, когда потоки прерывают друг друга. Он должен быть просто в состоянии разделить работу между потоками и быть уведомлен, когда это сделано. Так в чем же причина того, что Java хочет, чтобы мы имели дело с InteruptedException? По крайней мере, это должно быть RuntimeException
4 6

4 ответа:

Программисту даже не нужно беспокоиться, когда потоки прерывают друг друга

Это не так. Есть много, много ситуаций, в которых вы хотите знать, что прерывание было запрошено, но вы будете игнорировать его на некоторое время, чтобы закончить работу, которую вы делаете.

Например, предположим, что один поток открывает файл и начинает записывать некоторые данные. Затем этот поток блокируется, ожидая вычисления остальных данных. Предположим, что вторая поток пытается прервать первый. Что он должен делать? Просто умрите, и, возможно, вы получите поврежденный, неполный файл? Следует ли очистить его, удалив файл, который он начал писать? Должен ли он игнорировать запрос на прерывание и просто ждать окончания данных, которые он должен записать? Должен ли он написать что-то, означающее "Я был прерван здесь", чтобы он мог продолжить свою работу с этого момента в следующий раз?

В другом сценарии предположим, что у вас есть HTTP-сервер. Предположим, что пользователи получить доступ к вашему серверу и, скажем, загрузить с него большой файл. Вы хотите остановить сервер. Затем приложение попытается прервать все рабочие потоки. Что же им делать? Просто остановить загрузку? Или они должны ждать, пока пользователи закончат загрузку своих файлов, и только после этого они должны умереть, не принимая больше никаких запросов? Оба сценария одинаково верны.

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

Похоже, вы смешиваетепланировщик потоков и прерывание.

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

Прерывание означает, что вы прекращаете то, что делаете в данный момент, ине возвращаетесь к нему . Наиболее практичный способ реализовать это, с помощью исключение.

RuntimeExceptions должны представлять ошибки программирования (см. http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html ). InterruptedException больше похоже на сигнал из другого потока.

InteruptedException выбрасывается, когда поток принудительно прерывается. Это не обычная ситуация (например, когда поток контекстно переключается планировщиком). Примерами могут быть случаи, когда другой поток вручную прерывает его или процесс получает сигнал SIGINT .