Я делаю простой сервер, который будет генерировать несколько потоков для обработки нескольких клиентов. Мне было интересно, как закрыть и закрыть все потоки и потоки при завершении работы сервера.Java: Закрытие нескольких потоков правильно
Я добавил shutdownHook, который запускает метод, который сообщает серверу о завершении работы. Сервер, в свою очередь, транслирует вызов выключения на все потоки, которые он открыл, что устанавливает логическое значение «isClosed» в каждом потоке равным true.
Что я ожидаю, так это то, что каждый поток, когда доходит до конца метода run() и снова зацикливается, нажимает на условие (! IsClosed) условно, тем самым правильно завершая себя, закрывая все соответствующие сокеты/потоки и возвращение.
Однако, я не знаю, будет ли это правильно закрывать все, так как программа должна завершиться после завершения завершения shutdownhook. Он заканчивается довольно рано, так как все, что он делает, распространяется на закрывающее сообщение. Означает ли это, что некоторые потоки не получат достаточно времени для правильного закрытия?
Если да, то лучшим способом было бы, чтобы shutdownhook вручную закрывал каждую нить, гарантируя, что они закрылись, прежде чем вернуться?
Базовый подход не является неправильным, но вы также можете изучить 'Thread.interrupt()' в случае, если ваши потоки имеют в них блокирующие вызовы. (И имейте в виду, что не все такие вызовы прерываются - я считаю, что регулярные чтения сокетов не являются.) – millimoose
, если они являются не-демонами, тогда JVM не выйдет, пока все потоки не вернутся из их метода запуска, независимо от того, метод вернулся. – Affe
Используйте службу-исполнитель, чтобы управлять своими потоками и отключать службу-исполнитель, когда закончите. – assylias