2014-11-13 2 views
0

У меня есть следующая проблема:Как прекратить тему порожден от 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(). Какие-нибудь эффективные решения?

+1

Возможный дубликат http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java –

+0

I * think * BufferedReader выдает IOExecption, если он прерывается. Я постараюсь экспериментировать. – markspace

+0

Вызов System.exit * будет * завершать все запущенные потоки, без вопросов. Это «жесткий» способ. – Durandal

ответ

1

Попробуйте закрыть все клиентские сокеты. В этом случае все потоки чтения должны бросать IOException.

+0

Как мне это сделать? Я не отслеживаю используемые сокеты. Они создаются внутри порожденного потока для соответствующего клиента, поэтому у меня нет доступа к нему. –

+0

Да, вы должны отслеживать все сокеты. Вы можете сделать это, передав сокеты в какой-то общий объект владельца. То есть 'Socket s = ...; holder.add (s) ' –

+0

Я не думаю, что это лучший обходной путь для этой проблемы, но он сработал, поэтому я приму свой ответ. –

Смежные вопросы