Kommunikation zwischen Threads in Java


Kommunikation: Java Gewinde

Kommunikation zwischen Threads in Java

Inter-Thread-Kommunikation in Java oder Zusammenarbeit ist der Prozess der Koordination der Kommunikation zwischen den synchronisierten Themen. Das heißt, wenn ein neuer Thread in den kritischen Abschnitt eintreten möchte, wird der aktuell ausgeführte Thread angehalten, um den neuen Thread zuzulassen. Auf diese Weise wird das Risiko einer Deadlock-Situation verringert, wenn die synchronisierten Threads miteinander kooperieren. Wir können die Kommunikation zwischen Threads mithilfe der Methoden wait, notify und notifyAll der Object-Klasse implementieren.

Lassen Sie uns nun jede der folgenden Methoden im Detail betrachten.

Wartemethode

Die wait () -Methode pausiert die aktuelle Thread-Ausführung und wartet, bis die Zeit abgelaufen ist oder ein anderer Thread die notify () - oder notifyAll () -Methode aufruft.

Wir können die wait () -Methode nur innerhalb der aufrufen synchronisierte Methode oder synchronisierter Block, da der Thread den Monitor besitzen muss, sonst wird eine Ausnahme ausgelöst. Sobald die wait () -Methode aufgerufen wird, wird der aktuelle Sperrmonitor freigegeben.

public final void wait(long milliseconds) throws InterruptedException

Was ist ein Monitor?

Immer wenn ein synchronisierter Thread auf eine gemeinsam genutzte Ressource zugreifen möchte, erhält er eine Sperre und betritt den Monitor. Es kann jeweils nur ein Thread einen Monitor besitzen. Die anderen Threads müssen warten, bis der erste Thread den Monitor freigibt.

Benachrichtigungsmethode

Die Benachrichtigungsmethode aktiviert den Thread, der die Wartemethode für dieselbe Ressource aufgerufen hat. Dies führt dazu, dass der schlafende Thread seine Ausführung fortsetzt. Wenn sich im Wartezustand mehrere Threads für dieselbe gemeinsam genutzte Ressource befanden, wird einer von ihnen benachrichtigt.

public final void notify()

notifyAll-Methode

Die notifyAll-Methode aktiviert alle Threads, die die wait-Methode für dieselbe Ressource aufrufen. Wenn mehrere Threads vorhanden sind, wird der höchste Thread aktiviert Prioritäts-Thread.

public final void notifyAll()

Beispiel für die Kommunikation zwischen Threads in Java

Im Folgenden finden Sie ein Beispiel, das Ihnen hilft, die Implementierung der Kommunikation zwischen Threads in Java mithilfe der Methoden wait, notify und notifyAll zu verstehen.

class Stock {
  int qty = 15;
  
  synchronized void purchaseStock(int quantity) {
    System.out.println("Purchase stock");
    
    if(this.qty < quantity) {
      System.out.println("Insufficient quantity available");
      try {
        wait();
      }
      catch(Exception e) {
        e.printStackTrace();
      }
    }
    this.qty = this.qty - quantity;
    System.out.println("Purchase stock completed");
  }
  
  synchronized void addStock(int quantity) {
    System.out.println("Adding Product stock");
    
    this.qty = this.qty + quantity;
    System.out.println("Add stock completed");
    notify();
    
  }
}
public class InterThreadDemo {

  public static void main(String[] args) {
    Stock s = new Stock();
    new Thread() {
      public void run() {
        s.purchaseStock(20);
      }
    }.start();
    

    new Thread() {
      public void run() {
        s.addStock(10);
      }
    }.start();
  }

}
Purchase stock
Insufficient quantity available
Adding Product stock
Add stock completed
Purchase stock completed

Lassen Sie uns das obige Beispiel im Detail verstehen.

[VORLÄUFIGE VOLLAUTOMATISCHE TEXTÜBERSETZUNG - muss noch überarbeitet werden. Wir bitten um Ihr Verständnis.]
Konvertieren Sie ein Zeichen in int Java

Wenn der erste Thread das aufruft purchaseStock() Methode erwirbt es das Schloss und prüft, ob die erforderliche Menge im Lager verfügbar ist. Da die angeforderte Menge (20) geringer ist als die verfügbare Menge (15), wird die aufgerufene Menge aufgerufen wait() Methode.

Jetzt wird die Sperre aufgehoben und der zweite Thread gestartet, da sich der erste Thread im Wartezustand befindet. Der zweite Thread ruft die Methode addStock () auf, die die erforderliche Menge zum verfügbaren Bestand hinzufügt und dann die Methode aufruft notify() Methode. Das notify() Methode weckt den ersten Thread, der die aufgerufen hatte wait() Methode und setzt die Ausführung fort.

Da nun der erforderliche Bestand verfügbar ist, wird die angeforderte Menge verringert, der verfügbare Bestand aktualisiert und die Ausführung abgeschlossen.

Kommunikation zwischen Threads in JavaPin

Unterschied zwischen Warten und Schlafen

Obwohl Warte- und Schlafmethoden mehr oder weniger den gleichen Vorgang ausführen, gibt es einige Unterschiede wie unten.

wartenschlafen
Gehört zur ObjektklasseGehört zur Thread-Klasse
Es ist eine nicht statische MethodeEs ist eine statische Methode
Der Wartevorgang wird durch die Methoden notify oder notifyAll unterbrochenDer Ruhezustand wird nach einer bestimmten Zeit unterbrochen
Es gibt die Sperre frei, wenn die Wartemethode aufgerufen wirdEs gibt keine Sperre frei oder besitzt sie nicht

Referenz

1