4 つのスレッドを生成する Java プログラムがあります。各スレッドには、複数のソケット タイムアウトがあります。ただし、これらのタイムアウトは考慮されていないようです。つまり、readLine()
機能が長時間ブロックされる可能性があります。
次の動作が必要です: ソケットのタイムアウトを 300 ミリ秒に設定した場合、関数(つまり、基になる選択呼び出し) が呼び出されてreadLine()
から 300 ミリ秒以内に戻るようにします。readLine()
プロセッサの共有中に OS スケジューラがスレッドをスリープ状態にすることは理解していますが、この動作を保証するためにスレッドを常に強制的に起動する方法は Java にあるのでしょうか? それとも、これはマルチスレッド プログラミングを行う際の正しい考え方ではないのでしょうか?
理想的には、4 つのスレッドを生成して 6 コアのマシンで実行しているため、各スレッドは独自の CPU を取得して並行して実行し、選択タイムアウトを尊重する必要があります ... しかし、それはおそらく期待しすぎです.. .
PS: 実際には Thread.interrupt() を使用して、各スレッドが特定の時間内に終了するようにします (マスター スレッドで経過した時間をチェックし、長すぎる場合は子スレッドを中断します)。各スレッドで、(異なる) サーバーに接続し、要求を作成して、応答を待ちます。返事がいつまで続くかわかりません。readLine()
そのため、 でタイムアウトするまでメソッドを呼び出し続けSocketTimeoutException
ます。サーバーがこの時間内に応答を開始すると予想されるため、300 ミリ秒のタイムアウトを適用します。このタイムアウトを強制する理由は、サーバーがブロードキャスト方式で動作し、単一のクライアントによる要求に対する応答をすべてのクライアントに送信するためです。したがって、タイムアウトがなければ、他のクライアントからのリクエストに応じてデータを取得し続けます。