0

私は、メインスレッドがループでループし、ServerSocket.accept着信ソケットをワーカースレッドに渡す単純なHTTPサーバーを作成しています。ワーカースレッドは、それらを処理して応答を返します。ただし、サーバー全体をシャットダウンするシャットダウン要求を特別な場合に使用したいと思います。ワーカースレッドを使用してメインスレッドを強制的にacceptループから抜け出させて終了させるのに問題があります。

ポインタはありますか?

4

3 に答える 3

3

でワーカースレッドを中断してみましたworkerThread.interrupt();か?

これにより、acceptスローがInterruptedException発生します。これをキャッチし、クリーンアップする必要があるものをクリーンアップして、ワーカースレッドを終了できます。

于 2013-01-26T08:37:47.317 に答える
2

このスレッドで述べたように、サーバーソケットでclose()を呼び出すだけで、accept呼び出しで例外が発生します。

于 2013-01-26T09:02:31.740 に答える
2

あなたはおそらくそれを行うための100のハッキーな方法を思い付くことができますが、私は適切に設計されたアプリケーションで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 に答える