1

そのため、マルチスレッドがどのように機能するかについて少し混乱しています。たとえば、Threadcalledのサブクラスを作成するとMySub、次のようになります。

public class MySub extends Thread {
   public void run {
      for(int i = 0; i < 5; i++){
         System.out.println(i); 
      }
   }
}

そして、メインクラスでこれを行います:

public static void main(String[] args) {
    Thread m = new MySub();
    Thread m2 = new MySub();
    m.start();
    m2.start();
}

start()のメソッドを呼び出してから、スレッドの終了を待たずにのメソッドのm呼び出しに直接進むべきではありませんか? それがマルチスレッドのポイントではありませんか?start()m2m

しかし実際には、 の呼び出しから 0 から 4 を出力し、次にのstart()呼び出しで0 から 4 を出力します。それらは同時にではなく、順番に行われましたが、これは私が期待したものではありませんでした。0 から 4 の数字の混乱を予想していました。mstart()m2

4

1 に答える 1

5

これは競合状態 @Jake です。2番目のスレッドを開始する前に、最初のスレッドが終了するのを待ってmainいません。2 番目のスレッドを開始する機会を得る に作業を終了する最初のスレッドを開始しています。main

(たとえば) 1000 個の数値またはもっと時間がかかるものを印刷しようとすると、それらがインターリーブするのが見え始めます。または、より具体的に示すステートメントのThread.sleep(10)間に a を入れることもできます。println

implement Runnable参考: ではなく、クラスを作成することをお勧めしますextends Thread。次に、次のようにします。

Thread m1 = new Thread(new MySub());
m1.start();

また、ExecutorServiceスレッドを直接使用するよりも、コードを使用することをお勧めします。

于 2012-07-26T15:30:58.277 に答える