Я помню, что где-то читал, но я не могу здесь процитировать источник, что FileChannel
отчасти прерывается.Что после того, как операция чтения / записи перешла от JVM к ОС, JVM действительно не может многое сделать, поэтому операция займет время, которое требуется.Рекомендация состояла в том, чтобы читать / писать в чанках управляемого размера, чтобы JVM могла проверить состояние прерывания потока перед обработкой задания в ОС.
Я думаю, что ваш пример - прекрасная демонстрация такого поведения.
РЕДАКТИРОВАТЬ
Я думаю, что поведение FileChannel
, которое вы описываете, нарушает принцип "наименьшего удивления", но с определенной точки зрения работает, как и ожидалось, даже если вы подписались на это угол , по желанию.
Поскольку FileChannel
является "своего рода" прерываемым, а операции чтения / записи действительно блокируются, то эта операция блокировки действительно завершается успешно и возвращает действительные данные, которые представляют состояниефайл на диске.В случае небольшого файла вы можете даже получить все содержимое файла обратно.Поскольку у вас есть действительные данные, разработчики класса FileChannel сочли, что вы, возможно, захотите использовать их непосредственно перед тем, как вы начнете раскручивать прерывание.
Я думаю, что это поведение должно быть действительно , действительно хорошо документировано и для этого вы можете отправить сообщение об ошибке.Однако не останавливайтесь на том, что это когда-либо будет исправлено.
Я думаю, что единственный способ сказать, прерывается ли поток в одной и той же итерации цикла, - это делать то, что вы делаете, и явно проверять флаг прерывания потока.