0

4 つのスレッドを生成する Java プログラムがあります。各スレッドには、複数のソケット タイムアウトがあります。ただし、これらのタイムアウトは考慮されていないようです。つまり、readLine()機能が長時間ブロックされる可能性があります。

次の動作が必要です: ソケットのタイムアウトを 300 ミリ秒に設定した場合、関数(つまり、基になる選択呼び出し) が呼び出されてreadLine()から 300 ミリ秒以内に戻るようにします。readLine()プロセッサの共有中に OS スケジューラがスレッドをスリープ状態にすることは理解していますが、この動作を保証するためにスレッドを常に強制的に起動する方法は Java にあるのでしょうか? それとも、これはマルチスレッド プログラミングを行う際の正しい考え方ではないのでしょうか?

理想的には、4 つのスレッドを生成して 6 コアのマシンで実行しているため、各スレッドは独自の CPU を取得して並行して実行し、選択タイムアウトを尊重する必要があります ... しかし、それはおそらく期待しすぎです.. .

PS: 実際には Thread.interrupt() を使用して、各スレッドが特定の時間内に終了するようにします (マスター スレッドで経過した時間をチェックし、長すぎる場合は子スレッドを中断します)。各スレッドで、(異なる) サーバーに接続し、要求を作成して、応答を待ちます。返事がいつまで続くかわかりません。readLine()そのため、 でタイムアウトするまでメソッドを呼び出し続けSocketTimeoutExceptionます。サーバーがこの時間内に応答を開始すると予想されるため、300 ミリ秒のタイムアウトを適用します。このタイムアウトを強制する理由は、サーバーがブロードキャスト方式で動作し、単一のクライアントによる要求に対する応答をすべてのクライアントに送信するためです。したがって、タイムアウトがなければ、他のクライアントからのリクエストに応じてデータを取得し続けます。

4

2 に答える 2

1

私があなたの問題を本当に理解していればThread.interrupt()、操作を実行しているスレッドでいつでも呼び出しを試みることができreadLine()ます。コードを提供しなかったので、このリンクを残しておきます。一般的ですが、スレッドの中断に関する十分な情報を提供します。

次の 2 つのリンクも役に立つかもしれません: How do you kill a thread in Java? Javaでスレッドを高速かつクリーンな方法で中止する方法は? .

OS スケジューラに関する質問については、汎用 OS では、OS がタスクをスケジュールする方法を完全に制御できないことに注意してください。たとえば、Linux では割り込みが最優先タスクであり、タスクのスケジュール方法に「何らかの」決定論を適用できるスケジューリング ポリシーがあります。Java では、setPriority()メソッドを使用してスレッドの優先度を変更できますが、実際にはコマンドを使用するのと同じniceであり、それでもこのスレッドが他の OS スレッドよりも先にスケジュールされるという保証は得られません。

これが役立つことを願っています。

于 2011-05-02T23:44:49.150 に答える
0

あなたはここでいくつかの間違った仮定をしています:

  • タイムアウトは正確に 300 ミリ秒になります。実際、タイムアウトは少なくとも 300ms です。
  • OS スケジューラは、java スレッド内では (java os プロセスをスケジュールする以外に) 何もしません。
  • 6コアを持っているからといって、スレッドのそれぞれが別々のコアで実行されるという意味ではありません.Javaでスレッド->コアをバインドすることはできません.
  • 最後に、jvm には実行中のスレッドが 4 つしかないと考えますが、実際にはもっと多くのスレッド (ガベージ コレクター スレッドなど) があります。

あなたの質問をする:「この動作を保証するためにスレッドを常に起動させる方法は Java にありませんか?」 はい、コードによっては、スレッドがthread.sleep()の場合、スレッドを使用できます。 interrupt() (readline() が使用するため) を使用してInterruptionExceptionを処理するか、object.wait()の場合はobject.notify()またはobject.notifyAll( )を使用できます。

于 2011-05-02T23:44:15.080 に答える