2017-11-04 21 views
-2

私はjavaで同期を学習しています。今日、以下のサンプルコードを打ちました。Javaのマルチスレッド同期

以下のコードでは、test()メソッドが同期されています。だから、私はTH1 '完了ですsのテスト()呼び出しをしてからTH2' 仮定のテスト()呼び出しが開始します。しかし、そういうことは起こっていません。出力は互いに織り込まれています。理由を理解するのを助けてくれますか?

public class MyThread { 

    public static void main(String[] args) 
    { 
     SampleThread sample = new SampleThread("one"); 
     Thread th = new Thread(sample); 
     th.start(); 

     SampleThread sample2 = new SampleThread("two"); 
     Thread th2 = new Thread(sample2); 
     th2.start(); 
    } 
} 



class SampleThread implements Runnable 
{ 

    public SampleThread(String name) 
    { 
     this.name=name; 
    } 

    String name; 


    @Override 
    public void run() { 
     test(); 
    } 

    public synchronized void test() 
    { 
     for(int j=0;j<10;j++) 
     { 
      System.out.println(name + "--" + j); 
     } 
    } 

} 

答えて

0

スレッドを同期するには、スレッドを同期させるために共通点が必要です。オブジェクトを作成し、それをスレッドに渡すと、オブジェクトのsyncronizeにアクセスできます。最初のスレッドでオブジェクトのwaitが必要な場合は、notify秒です。 googleのFirst example

+0

ありがとう! – expert

0

メソッドtest()は同期されますが、複数のスレッドによって呼び出されるのではなく、各スレッドがSampleThreadの別個のインスタンスを持つためです。両方のスレッドに対して単一のSampleThreadを使用して、後続の出力を取得します。

public class MyThread { 

    public static void main(String[] args) { 
    final SampleThread sample = new SampleThread(); 

    Thread th = new Thread(sample); 
    th.start(); 

    Thread th2 = new Thread(sample); 
    th2.start(); 
    } 
} 


class SampleThread implements Runnable { 
    @Override 
    public void run() { 
    test(); 
    } 

    public synchronized void test() { 
    for (int j = 0; j < 10; j++) { 
     System.out.println(Thread.currentThread().getId() + "--" + j); 
    } 
    } 
} 
関連する問題