2017-11-04 5 views
-2

Ich lerne Synchronisation in Java. Habe heute den folgenden Beispielcode gefunden.Java Multi-Threading-Synchronisation

In der folgenden Code, test() Methode wird synchronisiert gemacht. Also gehe ich davon aus th1 's test() Aufruf würde vervollständigen und dann th2' s test() Aufruf starten würde. Aber so ist es nicht. Die Ausgänge sind miteinander verwoben. Kannst du mir bitte helfen, warum zu verstehen?

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); 
     } 
    } 

} 

Antwort

0

Zum Synchronisieren von Threads benötigen Sie einen gemeinsamen Punkt, um sie zu synchronisieren. Erstellen Sie ein Objekt, übergeben Sie es an die Threads, dann können Sie syncronize auf dem Objekt. Wenn Sie wait für das Objekt im ersten Thread und notify im zweiten Thread benötigen. First example von Google.

+0

Got jetzt, danke! – expert

0

Die Methode test() ist synchronisiert, wird aber nicht von mehreren Threads aufgerufen, da jeder Thread eine unterschiedliche Instanz von SampleThread enthält. Verwenden Sie ein einzelnes SampleThread für beide Threads, um eine nachfolgende Ausgabe zu erhalten.

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); 
    } 
    } 
}