我正在编写一个简单的 HTTP 服务器,其中主线程循环ServerSocket.accept
循环并将任何传入的套接字传递给工作线程,然后工作线程将处理它们并发送回响应。但是,我想在特殊情况下关闭整个服务器的关闭请求。我无法使用工作线程强制主线程跳出accept
循环并终止。
任何指针?
我正在编写一个简单的 HTTP 服务器,其中主线程循环ServerSocket.accept
循环并将任何传入的套接字传递给工作线程,然后工作线程将处理它们并发送回响应。但是,我想在特殊情况下关闭整个服务器的关闭请求。我无法使用工作线程强制主线程跳出accept
循环并终止。
任何指针?
您是否尝试过中断工作线程workerThread.interrupt();
?
这应该会accept
抛出一个InterruptedException
,您可以捕获它,清理需要清理的内容并退出工作线程。
您可能会想出 100 种 hacky 方法来做到这一点,但我只能在设计合理的应用程序中看到 2 种方法。
这是处理代码的中断。
while (acceptNextRequest()) {
// Processing code
if (shouldExitNow()) {
break;
}
// More processing
}
// Proper exiting code
在接受下一个请求之前检查是否该退出:
while (!shouldExitBeforeNextRequest() && acceptNextRequest()) {
// Processing code
}
// Proper exiting code
这两种解决方案都确保正确关闭所有连接、向所有应用程序关闭侦听器发出通知等。
如果您从 Web 应用程序执行 System.exit(),您将关闭整个 Web 服务器应用程序(Tomcat、JBoss 或任何用途),这通常不是您希望在应用程序中执行的操作。
如果您在容器中运行应用程序,请不要弄乱主线程。
就像在这个线程中提到的那样,您可以在服务器套接字上调用 close() ,这将导致在接受调用中出现异常。