Как изящно остановить поток, выполняющий операцию блокировки?
В общем, вы не можете.Но есть вещи, которые вы можете сделать с некоторыми конкретными операциями.Например, вы можете попытаться прервать поток.В случае, таком как ваш пример, когда у вас нет прямого доступа к Thread
, в котором выполняется задача, вы можете использовать Future.cancel()
:
serverFuture.cancel(true);
Но операции блокировки не обязательнобыть прерванным, когда их темы делают.Те, кто это делает, как правило, задокументированы для выброса InterruptedException
, и это не входит в число исключений ServerSocket.accept()
объявлено для выброса.В частности, для этого метода ваша лучшая ставка, вероятно, предполагает использование ServerSocket.setSoTimeout()
для установки подходящей верхней границы на количество времени, которое accept()
заблокирует.Использование относительно короткого времени ожидания и выполнение accept()
в цикле позволит вам периодически проверять, прерывать ли задачу.
В целом, вам необходимо выбрать стратегию, соответствующую той работе, которую вы пытаетесь выполнить.отмените, и вам, возможно, придется потратить некоторые усилия на проектирование, чтобы сделать эту задачу полностью прерываемой.