2

次のダミーコードがある場合:

public static void main(String[] args) {
  TestRunnable test1 = new TestRunnable();
  TestRunnable test2 = new TestRunnable();
  Thread thread1 = new Thread(test1);
  Thread thread2 = new Thread(test2);
  thread1.start();
  thread2.start();
}

public static class TestRunnable implements Runnable {
  @Override
  public void run() {
    while(true) {
      //bla bla
    }
  }
}

私の現在のプログラムでは、同じような構造、つまり同じ Run() メソッドを実行する 2 つのスレッドがあります。しかし、何らかの理由でスレッド 1 のみに CPU 時間が与えられます。つまり、スレッド 2 は実行する機会がありません。これは、スレッド 1 が while ループにある間、スレッド 2 が待機しているためですか?

スレッドがwhileループにある場合、他のスレッドを「ブロック」しているのでしょうか。私はそう思いますが、100%確実ではないので、ここで実際に何が起こっているのか誰かが私に知らせてくれたらうれしいです.

編集 さて、本当に単純な例をもう一度作成しようとしましたが、両方のスレッドが CPU 時間を取得しています。ただし、これは私の元のプログラムには当てはまりません。どこかのバグに違いない。それを今調べています。みんなのおかげで、少なくとも私はその知識を得ることができました。

4

4 に答える 4

7

JVM は、使用中のスレッドを停止して他のスレッドに CPU を与えるという保証はありません。

を呼び出すThread.yield();か、それが機能しない場合は callThread.sleep(100);をビジー ループ内で呼び出して、他のスレッドに CPU を割り当てることをお勧めします。

于 2012-11-19T23:21:27.653 に答える
1

ある時点で、最新のオペレーティング システムは現在のコンテキストをプリエンプトし、別のスレッドに切り替えます - ただし、 (全体的かなりばかげたことですが) CPU をトースターに変えます: この小さな「ビジー ループ」は、チェックサムを計算している可能性があります。それを遅くするのは残念です!

このため、 OS が制御を取得する前にスレッドの実行を生成するためsleep/yieldに、手動で (たとえsleep(0)1つでも) 実行することをお勧めします。実際には、指定された空のループ コードの場合、手動で明け渡すと、99% の CPU 使用率から 0% の CPU 使用率に変化します。(実際の数値は、各ループで実行される「作業」などによって異なります)


1スレッド/コンテキストを生成する最小時間は、OS と構成によって異なります。そのため、常に生成することが望ましいとは限りません。ただし、Java と「リアルタイム」は通常、同じ文には入りません。

于 2012-11-19T23:39:34.480 に答える
0

実際のスレッドスケジューリングは、JavaではなくOSによって処理される必要があります。これは、各スレッドに等しい実行時間を与える必要があることを意味します(ただし、予測可能な順序ではありません)。あなたの例では、各スレッドはスピンし、アクティブな間は何もしません。whileループ内で実行すると、実際にこれが発生していることがわかりますSystem.out.println(this.toString())。可能な限り、各スレッドがそれ自体を印刷するのを確認する必要があります。

なぜ1つのスレッドが支配的だと思いますか?

于 2012-11-19T23:22:46.777 に答える
0

OS は、スレッドのスケジューリングを担当します。それは数年前に変更されました。異なる OS (Windows/Linux など) によって異なり、CPU の数と実行中のコードに大きく依存します。コードに Thread.yield() や、モニターでの wait() メソッドを使用した同期ブロックなどの待機機能が含まれていない場合、CPU がスレッドを長時間実行し続ける可能性があります。
複数の CPU を搭載したマシンを使用すると、アプリケーションの並列処理が改善されますが、マルチスレッド環境で他のスレッドを実行させないスレッドの run() メソッド内にコードを記述するのは不適切なプログラミングです。

于 2012-11-19T23:27:08.153 に答える