私は、メインスレッドがループでループし、ServerSocket.accept
着信ソケットをワーカースレッドに渡す単純なHTTPサーバーを作成しています。ワーカースレッドは、それらを処理して応答を返します。ただし、サーバー全体をシャットダウンするシャットダウン要求を特別な場合に使用したいと思います。ワーカースレッドを使用してメインスレッドを強制的にaccept
ループから抜け出させて終了させるのに問題があります。
ポインタはありますか?
私は、メインスレッドがループでループし、ServerSocket.accept
着信ソケットをワーカースレッドに渡す単純なHTTPサーバーを作成しています。ワーカースレッドは、それらを処理して応答を返します。ただし、サーバー全体をシャットダウンするシャットダウン要求を特別な場合に使用したいと思います。ワーカースレッドを使用してメインスレッドを強制的にaccept
ループから抜け出させて終了させるのに問題があります。
ポインタはありますか?
でワーカースレッドを中断してみましたworkerThread.interrupt();
か?
これにより、accept
スローがInterruptedException
発生します。これをキャッチし、クリーンアップする必要があるものをクリーンアップして、ワーカースレッドを終了できます。
このスレッドで述べたように、サーバーソケットでclose()を呼び出すだけで、accept呼び出しで例外が発生します。
あなたはおそらくそれを行うための100のハッキーな方法を思い付くことができますが、私は適切に設計されたアプリケーションで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、またはその他の用途)が閉じられます。これは通常、アプリケーション内からは実行したくないことです。
また、アプリケーションをコンテナーで実行する場合は、メインスレッドを台無しにしないでください。