2017-06-24 5 views
-2

非常に単純なスレッドロジックを作成して競合状態を確認しましたが、予想外の動作が発生し、Javaのマルチスレッドに関する重要な概念が欠落していると思います。ここで子スレッドのスリープメソッドでメインスレッドもスリープする

は私のThreadクラスは

public class MyThreadDoinNothing implements Runnable { 
    private int count = 0; 

    @Override public void run() { 
     count++; 
     System.out.println(count); 
    } 
} 

だとここで私はMAINスレッドが〜1秒のために実行し、そのことで何が起こっているかcondition.Butレースで100の番号を印刷することが期待MAIN

public class MAIN { 
    public static void main(String[] args) throws InterruptedException { 
     Thread[] threads=new Thread[100]; 
     Runnable object=new MyThreadDoinNothing(); 
     for (int i=0;i<100;i++) { 
      threads[i] = new Thread(object); 
      threads[i].start(); 
      threads[i].sleep(1000); 
     } 
    } 
} 

です100秒の全体プログラムを取っています。スレッド[i] .sleep(1000)は、MAINではなくスリープするように特定のスレッドのみを作成するべきです。

私はここで何が欠けているのか分かりません。

答えて

1

別のスレッドをスリープ状態にすることはできません。スレッドがスリープ状態にしたい場合、スリープ状態にしなければなりません。

各スレッドのコードを書きます。したがって、別のスレッドに「到達して」何かをさせるような理由は決してありません。スレッドがスリープする必要がある場合、スリープするようにコード化する必要があります。スレッドがあなたがしたいことをしていない場合は、それを修正します。

2

Thread.sleep(long) javadocツールを使用すると、特定のThreadインスタンス上でそれを呼び出すことはできませんので、

現在メソッドがstaticある

をスリープ状態にスレッドを実行させる(強調は筆者)と言います。これらの呼び出しはそれぞれ、

threads[i].sleep(1000); 

あなたはインスタンスを通じてstaticメソッドを呼び出すべきではありません(とあなたのコンパイラはあなたに警告を与えるべきである)理由の一つである

Thread.sleep(1000); 

をやっ実際です。

+0

それはとてもうまく説明します。ありがとう! – leo017

+0

@ leo017:デビッドは最初に同様の説明をしていました –

関連する問題