2016-05-16 24 views
0

問題は、ブロックの同期の効果が見えないことです。理論では、ブロックがその時点で処理されるスレッドで終了するまで、ブロックをロックすることを想定しています。 synchronizedブロックの有無にかかわらず次のコードを実行すると、何も変わりません。少なくとも、それは私の考えです。基本的に、これらのスレッドを整然とした方法で表示させるにはどうしたらいいですか?ありがとうございました。非同期スレッドと同期スレッドの違い

public class Threads9 extends Thread{ 
    private String name; 

    public Threads9(String paramName){ 
     name = paramName; 
    } 

    public void run() { 
     print(); 
    } 
    private void print() { 
     synchronized(this){ 
     for(int i = 0;i<10;i++){ 
      System.out.println(name+ " looping"); 
     } 
     } 
    } 
} 

public class Threads9Main{ 
    public static void main(String[] args) { 

     Threads9 thread1 = new Threads9("Thread1"); 
     Threads9 thread2 = new Threads9("Thread2"); 

     thread1.start(); 
     thread2.start(); 
    } 
} 
+1

このメソッドはスレッドセーフではありませんので、 'のSystem.out.println(...)を使用すると、'例えばそれは出力がシステム 'と同じ順序で書かれていることを保証するものではありません(良いアイデアではありません。 out.println(...) 'が呼び出されました)。 「このチュートリアル」(https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html)を参照してください。 – Turing85

+1

2つのスレッドが異なるオブジェクト上で同期しています。 –

+0

Re、 "...何も変わらない"これはあなたが見ている問題を説明するための非常に弱い方法です。今回は運が良かったが、このサイトで助けを得るための最善の方法(つまり、最良の助けを得る方法)は、あなたのコードを表示し、あなたが思ったことを詳細に教え、それがどのように失敗したか教えてください(予期しないエラーメッセージの完全なテキストを含む)あなたの期待に応えて、何が間違っているのかを聞いてください。 –

答えて

1

"this"で同期していて、スレッド間で違いがあります。 Threads9.classで同期しようとするとうまくいきます。 また、ループのサイズを大幅に大きくするか、2番目の起動前に1番目のループが終了します。

+1

'Thread9.class'でのロックがうまくいく間に、私が最近知らされているように、他の無関係なオブジェクトがクラスオブジェクトにロックされる可能性があるので、明示的なモニタをロックする方が良い方法です。 – Lee

+0

おそらく。しかし、他の人がオブジェクト(クラス)をロックすることを許可することで、デッドロックの可能性を減らすことができます(すべては通常どおりユースケースに依存します)。 –

0

あなたのオブジェクトはモニターを共有していないので、スレッド間通信はありません。

試してみてください。

public class Threads9 extends Thread{ private String name; 

    private static Object lock = new Object(); 

    public Threads9(String paramName){ 
     name = paramName; 
    } 

    public void run() { 
     print(); 
    } 

    private void print() { 
     synchronized(lock){ 
      for(int i = 0;i<10;i++){ 
       System.out.println(name+ " looping"); 
      } 
     } 
    } 
} 
+0

しかし、今問題は、それは私に最後のスレッドを何度も表示することだけです。どのように適切なスレッドを表示するようにすることができますか? –

0
は、このようなあなたのコードを変更

し、実行内側に入れて同期ブロック。

public Threads9(String paramName){ 
    name = paramName; 
} 

public void run() { 
    synchronized(this){ 
    print(); 
    } 
} 

private void print() { 

    for(int i = 0;i<10;i++){ 
     System.out.println(name+ " looping"); 
    } 

} 
+0

これはどのように役立つでしょうか?それはできません。 – bowmore