我创建了一个小(单线程)服务器并将“work”代码放在Runnable
中。然后使用Javas Executor Framework在后台线程中执行此runnable:
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()
- 方法,则服务器仍将等到最后一次连接并且然后关机。
有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
因此,在等待close()
上调用ServerSocket
的接缝就是这样做的一种方式。在这种情况下,accept()
- 方法将抛出SocketException
,您需要抓住它。
另一种更明确的方法是使用“毒丸”,这里详细解释:How to interrupt a BlockingQueue which is blocking on take()?