Я пытаюсь спроектировать свой код так, чтобы он мог быть "отключен" с прерыванием. Главным образом, это связано с тем, что Executor
инфраструктура в пакете параллелизма Java использует interrupt
для отмены запущенных задач. Кроме того, задача «завершение работы» не должна знать какие-либо внутренние элементы этой задачи.
Однако вызов accept
не будет отвечать на прерывание , если это , созданное из ServerSocketChannel
. Сервер, созданный с помощью конструктора ServerSocket
, будет игнорировать прерывания, и я не нашел способ перенастроить это.
Если вы не можете изменить код, который создает сервер, организуйте другой поток для вызова close
на сокете сервера. Это также вызовет исключение в потоке, заблокированном на accept
, независимо от метода, использованного для создания сокета сервера.
Оказывается, это очень большая боль при использовании SSL. Сокет JSSE не создается из InterruptibleChannel
и не будет реагировать на простое прерывание в потоке.
Я только что заметил, что в вопросе говорится, что сервер не может быть закрыт без уведомления клиента. Успешное прерывание сокета приводит к его закрытию.
При вызове accept
это не должно быть проблемой, так как клиент не подключен, если сокет сервера заблокирован при принятии. Это должно быть проблемой только для Socket
экземпляров, которые представляют текущие соединения.
Если это не удовлетворяет требованиям уведомления, может потребоваться доработка для использования NIO ServerSocketChannel
в неблокирующем режиме.