2016-06-17 9 views
0

"for"ループを使用して、データ0〜4を出力する100個のスレッドを生成します。Forループ生成されたマルチスレッドはsynchronizedを使用できませんか?

public class ThreadTest implements Runnable { 
    static volatile int threadNum = 100; 
    public void run() { 
     synchronized (this) { 
      for (int i = 0; i < 5; i++) { 
       System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     for (int i = 0; i < threadNum; i++) { 
      ThreadTest t = new ThreadTest(); 
      Thread t1 = new Thread(t); 
      t1.start(); 
     } 
    } 
} 

は、私はかつて、「同期」一つだけのスレッドが「を」ループを動作させることができるので、スレッドごとに0〜4の順序でデータを取得するために願っています。しかし、印刷結果は期待通りではありません。

enter image description here

は、誰も私には私の問題は、私たちが何であるかを指すように助けることができますか? 〜

+4

ヒント:スクリーンショットの投稿を避ける。あなたの出力は「純粋なテキスト」です。そのテキストのコピー/ペーストを単純に行う方がはるかに簡単です。 – GhostCat

答えて

3

ありがとうあなたはsynchronizesynchronized (this)を使用して)現在のThreadTestインスタンスにアクセスすると、それは無用であるので、あなたは、スレッドごとに、このようなインスタンスを持っている、あなたは代わりとして例えばクラスのような一般的なミューテックスで同期する必要があるためこれは、

synchronized (ThreadTest.class) { 
    for (int i = 0; i < 5; i++) { 
     System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); 
    } 
} 
+0

提案したようにコードを修正した後、問題は解決します。ありがとうございました! –

1

ここにはすべてが期待されています。

あなたのThreadTestオブジェクトはそれぞれ、ポインタで同期しています。

100人の100スプーンと100ボウルを与えて食べ始めるように言うと、どうなると思いますか?たぶん、もしあなたが100人の合計で1スプーンしか持っていなかったら、それは何か変わるでしょうか?

ショートストーリー:の1つのオブジェクトに同期する必要があります.100種類のものではありません。

関連する問題