【发布时间】:2013-01-10 05:02:27
【问题描述】:
我正在编写一个简单的 HTTP 服务器,其中主线程在 ServerSocket.accept 循环中循环,并将任何传入的套接字传递给工作线程,然后工作线程将处理它们并发回响应。但是,我想在特殊情况下关闭整个服务器的关闭请求。我在使用工作线程强制主线程跳出accept 循环并终止时遇到问题。
任何指针?
【问题讨论】:
标签: java multithreading concurrency
我正在编写一个简单的 HTTP 服务器,其中主线程在 ServerSocket.accept 循环中循环,并将任何传入的套接字传递给工作线程,然后工作线程将处理它们并发回响应。但是,我想在特殊情况下关闭整个服务器的关闭请求。我在使用工作线程强制主线程跳出accept 循环并终止时遇到问题。
任何指针?
【问题讨论】:
标签: java multithreading concurrency
您可能会想出 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 或任何用途),这通常不是您希望在应用程序中执行的操作。
如果您在容器中运行应用程序,请不要弄乱主线程。
【讨论】:
就像提到的in this thread 一样,您可以在服务器套接字上调用close(),这将导致accept 调用中的异常。
【讨论】:
您是否尝试过使用workerThread.interrupt(); 中断工作线程?
这应该会让accept 抛出一个InterruptedException,你可以捕获、清理需要清理的内容并退出工作线程。
【讨论】: