我正在编写一个简单的HTTP服务器,其中主线程在ServerSocket.accept
循环中循环,并将任何传入的套接字传递给工作线程,然后工作线程将处理它们并发回响应。但是,我想特殊情况下关闭请求将关闭我的整个服务器。我在使用工作线程强制主线程突破accept
循环并终止时遇到问题。
任何指针?
答案 0 :(得分:3)
您是否尝试使用workerThread.interrupt();
中断工作线程?
这应该使accept
抛出一个InterruptedException
,你可以抓住它,清理需要清理的东西并退出工作线程。
答案 1 :(得分:2)
就像提到的in this thread一样,你可以在服务器套接字上调用close(),这会在accept调用中导致异常。
答案 2 :(得分:2)
你可能会想出100种黑客方法,但我只能在正确设计的应用程序中看到两种方法。
这是处理代码的一个突破。
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或其他任何用途),这通常不是您希望在应用程序中执行的操作。
如果在容器中运行应用程序,请不要乱用主线程。