【问题标题】:How to shut down a waiting server?如何关闭等待的服务器?
【发布时间】:2011-12-27 23:40:33
【问题描述】:

我创建了一个小(单线程)服务器并将“工作”代码放在Runnable 中。然后使用 Javas Executor 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 抛出的异常?我实际上不确定这是否会奏效。 stackoverflow.com/questions/2486335/…
  • 类似问题:stackoverflow.com/questions/2983835/… - 好像你需要关闭套接字。
  • [类似问题][1]: - 好像你需要关闭套接字 [1]: stackoverflow.com/questions/2983835/…
  • 可以使用 NIO 使套接字可中断吗?这当然适用于客户端套接字;我从未尝试过服务器套接字。

标签: java sockets shutdown executorservice


【解决方案1】:

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

另一种可能更清楚的方法是使用“毒丸”,此处详细说明:How to interrupt a BlockingQueue which is blocking on take()?

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多