Я создал небольшой (единственный поток) сервер и поместил «рабочий» -код в Runnable
. Это работоспособный затем выполняются в фоновой-нити с помощью Javas палача Framework:Как закрыть ожидающий сервер?
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(runnable);
Так что теперь, я ищу хороший способ закрыть этот сервер вниз. Я хочу добавить возможность перезапуска сервера без перезапуска программы, поэтому завершение всего процесса не является вариантом.
What I have found что-то вроде этого:
class LifecycleWebServer {
private final ExecutorService exec = ...;
public void start() throws IOException {
ServerSocket socket = new ServerSocket(80);
while (!exec.isShutdown()) {
final Socket conn = socket.accept();
// Do stuff with the connection...
}
}
public void stop() { exec.shutdown(); }
}
Дело в том, что беспокоит меня, что если программа достигла линии 7 (socket.accept()
), и я называю stop()
-метод, сервер будет по-прежнему ждать, пока последнее соединение было выполнено, а затем выключено.
Есть ли какой-либо предпочтительный способ справиться с этим?
Я отвечал на подобный вопрос для сокета кода, написанного на C/C++ и получил большой ответ. Я подозреваю, что вам нужно использовать неблокирующие сокеты для достижения аналогичного эффекта. Вы пытались просто закрыть сокет из другого потока и поймать исключение, созданное socket.accept? На самом деле я не уверен, что это сработает. http://stackoverflow.com/questions/2486335/wake-up-thread-blocked-on-accept-call – selbie
Аналогичный вопрос: http://stackoverflow.com/questions/2983835/how-can-i-interrupt-a -serversocket-accept-method - кажется, что вам нужно закрыть сокет. –
[подобный вопрос] [1]: - Похоже, вам нужно закрыть сокет [1]: http://stackoverflow.com/questions/2983835/how-can-i-interrupt-a- serversocket-accept-method –