Как остановить другие темы в ExecutorService? - PullRequest
1 голос
/ 02 мая 2020

Я создал клиент-серверное приложение для чата, и у меня возникает дисбаланс потоков, потому что я могу завершить только один поток в моем пуле (2 потока).

Например, сервер загружается. Он создает один пул с двумя потоками (один для отправки, один для получения). Сервер отправляет сообщение. Удаляет исходный поток для отправки и создает новый пул. Теперь есть исходный поток получения и новый пул с еще двумя потоками. Он делает то же самое для противоположной истории (получение сообщения).

Оба потока застряли в ожидании ввода или вывода, поэтому я не думаю, что могу сделать какую-либо проверку, чтобы увидеть, если другой поток завершено в пуле.

Код выглядит примерно так

ExecutorService executorService = Executors.newFixedThreadPool(2);
Future<String> send = executorService.submit(this::send);
Future<String> receive = executorService.submit(this::receive);

<some code to check to see if the future is completed>
sendComplete.cancel(true);
receiveComplete.cancel(true);
executorService.shutdownNow();

private void send() throws IOException {
        OutputStream os= socket.getOutputStream();
        BufferedReader read= new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw= new PrintWriter(os, true);
********String msg= read.readLine(); //This is wear it freezes

        pw.println(messageOutput);
        pw.flush();
    } 

Прием замораживается из-за аналогичной строки.

Есть ли способ завершить / закрыть все темы в ExecutorService / пуле? shutdownNow () не работает, потому что код в потоке застрял / застрял в ожидании ввода / вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...