Только несколько четко определенных «методов блокировки» являются прерываемыми. Если поток прерывается, устанавливается флаг, но больше ничего не произойдет, пока поток не достигнет одной из этих четко определенных точек прерывания.
Например, вызовы read()
и write()
прерываются, если они вызываются в потоках, созданных с помощью InterruptibleChannel
. Если в качестве начальной точки используется Socket
, то вызов interrupt()
для Thread
, заблокированного в чтении, не имеет никакого эффекта. Обратите внимание, что если блокирующая операция ввода-вывода успешно прерывается, основной канал закрывается.
Другой большой класс прерываемых операций - это те, которые генерируются различными блокирующими операциями над классами в пакетах java.util.concurrent
. Конечно, оригинальный wait()
метод также является прерываемым.
Методы блокировки могут быть определены путем поиска throws InterruptedException
в сигнатурах их методов. Они также должны быть хорошо документированы, чтобы описать любые побочные эффекты прерывания.
Вы можете написать собственный прерываемый метод, но он должен состоять из самих прерываемых операций нижнего уровня.