Почему InterruptedException является проверенным исключением?
Это вопрос о старой Java, когда мы создавали свои собственные потоки. Некоторые методы, такие как Thread.sleep(100)
бросить InterruptedException
когда это прервано другим потоком. Теперь, как я понимаю, прерывание означает, что другая нить говорит: позвольте мне взять на себя сейчас.
Когда это происходит, почему Java хочет, чтобы мы имели дело с InterruptedException
?
Программисту даже не нужно заботиться, когда потоки прерывают друг друга. Он должен просто уметь делить работу между потоками и получать уведомления, когда она будет завершена. Так в чем причина того, что Java хочет, чтобы мы имели дело с InteruptedException
? По крайней мере, так должно быть RuntimeException
4 ответа
Программисту даже не нужно заботиться, когда потоки мешают друг другу
Это неправда. Есть много, много ситуаций, в которых вы хотите знать, что прерывание было запрошено, но вы будете игнорировать его на некоторое время, чтобы закончить работу, которую вы делаете.
Например, предположим, что один поток открывает файл и начинает записывать некоторые данные. Затем этот поток блокирует, ожидая, когда будут рассчитаны остальные данные. Предположим, что второй поток пытается прервать первый. Что это должно сделать? Просто умри, и, возможно, у тебя получится поврежденный, неполный файл? Должен ли он очиститься, удалив файл, который начал писать? Должен ли он игнорировать запрос прерывания и просто ждать окончания данных, которые он должен записать? Должен ли он написать что-то, означающее "я был прерван здесь", чтобы он мог продолжить свою работу с этого момента в следующий раз?
В другом сценарии предположим, что у вас есть HTTP-сервер. Предположим, пользователи получают доступ к вашему серверу и, скажем, загружают с него большой файл. Вы хотите остановить сервер. Затем приложение попытается прервать все рабочие потоки. Что они должны делать? Просто прекратить загрузку? Или они должны подождать, пока пользователи закончат загрузку своих файлов, и только после этого они умрут, не принимая больше никаких запросов? Оба сценария одинаково действительны.
Как видите, существует слишком много возможных сценариев, и было бы ужасно, если бы у нас не было возможности узнать, что было запрошено прерывание. Иногда вы просто позволяете нити умереть. Иногда вы должны очистить окружающую среду. Иногда вы хотите, чтобы он завершил запрос, над которым он работает, но не принимал больше запросов.
Кажется, вы смешиваете между планировщиком потоков и прерыванием.
Планировщик потоков - это скорее нативная система, которая делит задания из нескольких потоков на процессы. Если активно слишком много потоков, планировщик будет работать асинхронно. Другими словами, позвольте мне вступить во владение на данный момент может быть вполне правдой.
Прерывание означает, что оставьте то, что вы сейчас делаете, и не возвращайтесь к нему. Наиболее практичный способ реализовать это, за исключением.
InteruptedException
выбрасывается, когда поток принудительно прерывается. Это не обычная ситуация (т.е. когда поток является контекстом, переключенным планировщиком). Примеры могут быть, когда другой поток вручную прерывает его или процесс получает SIGINT
сигнал.
Предполагается, что RuntimeExceptions представляют собой ошибки программирования (см. http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html). InterruptedException больше похож на сигнал из другого потока.