Java:允许工作线程杀死主线程

时间:2013-01-26 08:33:56

标签: java multithreading concurrency

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

任何指针?

3 个答案:

答案 0 :(得分:3)

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

这应该使accept抛出一个InterruptedException,你可以抓住它,清理需要清理的东西并退出工作线程。

答案 1 :(得分:2)

就像提到的in this thread一样,你可以在服务器套接字上调用close(),这会在accept调用中导致异常。

答案 2 :(得分:2)

你可能会想出100种黑客方法,但我只能在正确设计的应用程序中看到两种方法。

  1. 这是处理代码的一个突破。

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

    while (!shouldExitBeforeNextRequest() && acceptNextRequest()) {
        // Processing code
    }
    // Proper exiting code
    
  3. 两种解决方案都可确保正确关闭所有连接,通知所有应用程序关闭侦听器等等。

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

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