如何关闭等待的服务器?

时间:2011-12-27 23:40:34

标签: java sockets shutdown executorservice

我创建了一个小(单线程)服务器并将“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() - 方法,则服务器仍将等到最后一次连接并且然后关机。

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

因此,在等待close()上调用ServerSocket的接缝就是这样做的一种方式。在这种情况下,accept() - 方法将抛出SocketException,您需要抓住它。

另一种更明确的方法是使用“毒丸”,这里详细解释:How to interrupt a BlockingQueue which is blocking on take()?