0

我正在编写一个简单的 HTTP 服务器,其中主线程循环ServerSocket.accept循环并将任何传入的套接字传递给工作线程,然后工作线程将处理它们并发送回响应。但是,我想在特殊情况下关闭整个服务器的关闭请求。我无法使用工作线程强制主线程跳出accept循环并终止。

任何指针?

4

3 回答 3

3

您是否尝试过中断工作线程workerThread.interrupt();

这应该会accept抛出一个InterruptedException,您可以捕获它,清理需要清理的内容并退出工作线程。

于 2013-01-26T08:37:47.317 回答
2

您可能会想出 100 种 hacky 方法来做到这一点,但我只能在设计合理的应用程序中看到 2 种方法。

  1. 这是处理代码的中断。

    while (acceptNextRequest()) {
        // Processing code
        if (shouldExitNow()) {
            break;
        }
        // More processing
    }
    // Proper exiting code
    
  2. 在接受下一个请求之前检查是否该退出:

    while (!shouldExitBeforeNextRequest() && acceptNextRequest()) {
        // Processing code
    }
    // Proper exiting code
    

这两种解决方案都确保正确关闭所有连接、向所有应用程序关闭侦听器发出通知等。

如果您从 Web 应用程序执行 System.exit(),您将关闭整个 Web 服务器应用程序(Tomcat、JBoss 或任何用途),这通常不是您希望在应用程序中执行的操作。

如果您在容器中运行应用程序,请不要弄乱主线程。

于 2013-01-26T10:23:45.017 回答
2

就像在这个线程中提到的那样,您可以在服务器套接字上调用 close() ,这将导致在接受调用中出现异常。

于 2013-01-26T09:02:31.740 回答