2017-05-09 1 views
0

Ich habe drei synchronisierte Methoden in einer Klasse, wenn ich versuche, alle von ihnen zu starten, indem Sie verschiedene Threads starten, ich bin nicht in der Lage, die synchronisierte Ausgabe zu sehen, keine Sperre wird auf Objekt & ich konnte in der Ausgabe alle Threads werden gleichzeitig ausgeführt. Unten ist mein Code. Eingaben werden geschätzt. DankSynchronisiert in Multithreading

public class Displaymessage {

public static synchronized void sayHello(String name) throws InterruptedException{ 
    for(int i=1; i<=10;i++){ 
     Thread.sleep(1000); 
     System.out.println("How are you"+name); 
    } 
} 
public synchronized void sayHello1(String name2,int j){ 
    for(int i=1; i<=10;i++){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("How are you Hello1 :: "+name2+ " Age " + j); 
    } 
} 
public synchronized void sayHello2(String name3,String lastname){ 
    for(int i=1; i<=10;i++){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("How are you Hello 2 :: "+ name3 + " lastname " +lastname); 
    } 
} 

} Thread-Klasse:

public class MyThread erstreckt Thema {

String name; 


MyThread(String name) { 

    this.name = name; 
} 

public void run() { 

    try { 
     DisplayMessage.sayHello(name); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

} Thread2 Klasse: public class MyThread2 erstreckt Thema {

String name2; 
String name3; 

int age; 
DisplayMessage dm; 

MyThread2(DisplayMessage dm, String name2, int age) { 
    this.dm = dm; 
    this.name2 = name2; 
    this.age = age; 
} 

public void run() { 

    dm.sayHello1(name2, age); 

} 

} Thread3 Klasse:

Paket Synchronisation.Klassensperre;

public class MyThread3 Gewinde erstreckt {

String name3; 
String lastname; 
int age; 

DisplayMessage dm2; 

MyThread3(DisplayMessage dm, String name3, String lastname) { 
    this.dm2 = dm; 
    this.name3 = name3; 
    this.lastname = lastname; 
} 

public void run() { 

    dm2.sayHello2(name3, lastname); 
} 

}

Democlass mit Hauptmethode verschiedene Threads public class SynchronizationDemo Laichen {

public static void main(String[] args) { 
    DisplayMessage dm=new DisplayMessage(); 
    MyThread t1= new MyThread("steve"); 
    MyThread t2=new MyThread("Anitha"); 
    MyThread2 t3=new MyThread2(dm," Amit", 31); 
    MyThread3 t4=new MyThread3(dm," Arit ","urkude"); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
    t4.start(); 

} 

}

unten sind die Ausgänge :

Wie yousteve sind Wie geht's dir hello1 :: Amit Alter 31 Wie geht's dir hello1 :: Amit Alter 31 Wie yousteve sind Wie yousteve sind Wie geht's dir hello1 :: Amit Alter 31 Wie sind yousteve Wie gehe es dir hello1 :: Amit Alter 31 Wie yousteve ist Wie gehe es dir hello1 :: Amit Alter 31 Wie yousteve ist Wie geht es dir hello1 :: Amit Alter 31 Wie ist yousteve Wie gehe es dir hello1 :: Amit Alter 31 Wie geht es dir Hallo1 :: Amit Alter 31 Wie geht es dir? Wie sind yousteve Wie geht's dir hello1 :: Amit Alter 31 Wie yousteve sind Wie geht's dir hello1 :: Amit Alter 31 Wie sind youAnitha Wie geht es Ihnen Hallo 2 :: Arit Nachname urkude Wie sind youAnitha Wie sind Hallo ihr 2 :: Arit Nachname urkude Wie sind youAni Wie geht's dir Hallo 2 :: Arit Nachname urkude Wie sind youAni Wie geht's dir Hallo 2 :: Arit Nachname urkude How are you Hallo 2 :: Arit Nachname urkude Wie geht es dirAni Wie geht es dirAni Wie geht es dir Hallo 2 :: Arit lastname urkude Wie youAni sind Wie geht's dir Hallo 2 :: Arit Nachname urkude Wie geht's dir Hallo 2 :: Arit Nachname urkude Wie youAni sind Wie sind youAni Wie geht's dir Hallo 2 :: Arit Nachname urkude Wie youAni sind Wie sind Sie Hallo 2 :: Arit lastname urkude

+0

Sie synchronisieren auf einer statischen Methode sowie 2 Instanzmethoden, ist das, was Sie wollen ?. Warum nicht nur eine Methode verwenden und sehen, wie synchronisiert funktioniert – TheLostMind

Antwort

2

Die Ausgabe, die Sie sehen, ist nach Ihrem Code einwandfrei gültig. MyThread verwendet DisplayMessage.sayHello() Methode, die static ist und daher auf das Objekt DisplayMessage.class synchronisiert. Verwendung von synchronized Schlüsselwort auf static Verfahren ist äquivalent zu:

public static void sayHello(String name) throws InterruptedException{ 
    synchronized(DisplayMessage.class) { 
     for(int i=1; i<=10;i++){ 
      Thread.sleep(1000); 
      System.out.println("How are you"+name); 
     } 
    } 
} 

Auf der anderen Seite zwei andere Fäden, MyThread2MyThread3 und rufen nicht statischen Methoden - sayHello1 und sayHello2, die auf this synchronisiert sind. Die Verwendung von synchronized Schlüsselwort in diesem Fall entspricht:

public void sayHello1(String name2,int j){ 
    synchronized(DisplayMessage.this) { 
     for(int i=1; i<=10;i++){ 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("How are you Hello1 :: "+name2+ " Age " + j); 
     } 
    } 
} 

So, Ihre Ausgabe enthält steve und Amit concurently gefolgt von Laufen Anitha und Arit concurently ausgeführt wird, von der erwartet wird als Code auf zwei verschiedene Objekte synchronisiert ist.

+0

Dank für die Erklärung – GoodToLearn

+0

Können Sie bitte meine Antwort abstimmen und als akzeptiert markieren, wenn es Ihr Problem löst? – Piotrek

1

Das synchronisierte Schlüsselwort, das der statischen Methode hinzugefügt wird, entspricht der aktuellen * .java-Datei, die der Klassensperre entspricht. und synchronisiertes Schlüsselwort, das der nicht statischen Methode hinzugefügt wurde, ist diese Objektsperre. Obwohl die beiden Sperren unterschiedlich sind, können Objektsperre und Klassensperre jedoch erneut eingegeben werden.