У меня есть следующая проблема:Как прекратить тему порожден от ExecutorService
Я бегу сервер, который устанавливает соединение TCP со всеми клиентами, которые подключаются в отдельном Thread
порожденного ExecutorService
. У меня есть команда выхода, которая должна завершать сервер, включая все потоки, порожденные ExecutorService
. В каждом конкретном Thread
, связанном с клиентом, у меня есть while
-loop, где я жду ввода клиента в состоянии, используя InputStream
соответствующего сокета. У меня также есть глобальная переменная boolean
, которая указывает, находится ли сервер в сети. Как только он превратится в false
, я разбиваю цикл и завершаю поток. Это выглядит в основном так:
// userInput - String
// in - BufferedReader associated with the input stream of the client's socket
while ((userInput = in.readLine()) != null && serverIsOnline) {
//do some stuff
}
Однако, проблема заключается в том, что in.readLine()
является блокирующей операцией и поэтому весь сервер не будет прекращен, если все клиенты не вводить в чем-то. ExecutorService.shutDownNow()
также не работает, так как прерывание в этом случае неэффективно, потому что поток блокируется другой операцией. Я также хочу избежать System.exit()
. Какие-нибудь эффективные решения?
Возможный дубликат http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java –
I * think * BufferedReader выдает IOExecption, если он прерывается. Я постараюсь экспериментировать. – markspace
Вызов System.exit * будет * завершать все запущенные потоки, без вопросов. Это «жесткий» способ. – Durandal