Java 如何关闭等待的服务器?

Java 如何关闭等待的服务器?,java,sockets,shutdown,executorservice,Java,Sockets,Shutdown,Executorservice,我创建了一个小型(单线程)服务器,并将“工作”-代码放在一个可运行的中。然后使用Javas Executor框架在后台线程中执行此runnable: ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(runnable); 现在,我正在寻找一种关闭服务器的好方法。我想添加在不重新启动程序的情况下重新启动服务器的可能性,因此终止整个过程不是一个选项 是这样的: class LifecycleWebSer

我创建了一个小型(单线程)服务器,并将“工作”-代码放在一个
可运行的
中。然后使用Javas Executor框架在后台线程中执行此runnable:

ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(runnable);
现在,我正在寻找一种关闭服务器的好方法。我想添加在不重新启动程序的情况下重新启动服务器的可能性,因此终止整个过程不是一个选项

是这样的:

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()
-方法,那么服务器仍然会等待最后一次连接,然后关闭


有没有更好的方法来处理这个问题?

因此,在等待的
ServerSocket
上调用
close()
是一种方法。在这种情况下,
accept()
-方法将抛出一个
SocketException
,您需要捕获它


另一种可能更清晰的方法是使用“毒药丸”,这里对此进行了详细解释:

我针对用C/C++编写的套接字代码发布了一个类似的问题,得到了一个很好的答案。我怀疑您需要使用非阻塞套接字来实现类似的效果。您是否尝试过从另一个线程关闭套接字并捕获socket.accept引发的异常?事实上,我不确定这是否有效。类似问题:-似乎需要关闭套接字。[类似问题][1]:-似乎需要关闭套接字[1]:可以使用NIO使套接字可中断吗?这当然适用于客户端套接字;我从未尝试过服务器套接字。