CodeGym/Java blogg/Slumpmässig/Wait()-metoden i Java
John Squirrels
Nivå
San Francisco

Wait()-metoden i Java

Publicerad i gruppen
I den här artikeln kommer vi att titta på metoden wait() för att styra tråden och metoderna notify() / notifyAll() . Dessa metoder är definierade i basklassen java.lang.Object och följaktligen tillhandahåller arvsmekanismerna som finns i Java dessa metoder till absolut alla klasser. Det vill säga när du skapar din egen klass och dess objekt kan du alltid anropa dessa metoder.

Hur fungerar metoderna wait() och notify()/notifyAll()?

  • vänta() . kort sagt, denna metod släpper övervakaren och sätter den anropande tråden i ett vänteläge tills en annan tråd anropar notify() / notifyAll()- metoden;
  • notify() . Fortsätter arbetet med en tråd vars wait()-metod tidigare kallades;
  • notifyAll() -metoden återupptar alla trådar som tidigare har anropats sin wait()- metod.
Låt oss nu titta närmare på metoden wait() . Objektklassen innehåller tre alternativ för denna metod :
  • public final native void wait (lång timeoutMillis) kastar InterruptedException ; Det gör att den aktuella tråden väntar tills den väcks. Vanligtvis sker det genom att meddelas eller avbrytas, eller tills en viss tid i realtid har förflutit.

  • public final void wait() kastar InterruptedException . Det är ingen slump att vi skrev en metod utan parametrar som den andra. Faktum är att om du tittar på dess kod hänvisar den till den första varianten av metoden, den har bara argumentet 0L.

  • offentlig sista väntan​(lång timeout, int nanos) . Får den aktuella tråden att vänta tills den väcks, vanligtvis genom att meddelas eller avbrytas, eller tills en viss tid i realtid har förflutit.

Metoden wait () är avsedd att avbryta den anropande tråden. Vad betyder det? Dessa metoder tillhör klassen. Baserat på klassen skapar du ett objekt. Objekt finns i vissa trådar. Det vill säga att objekt skapas i vissa trådar. I tråden där detta objekt fungerar, om du anropar wait() i det, kommer detta att leda till att den här tråden stoppas. Objektet i sig fungerar som en slags monitor. Vad är det? Det är tydligt att du kan skapa olika objekt och alla kommer att innehålla wait()metod. Det finns en förståelse för vilket objekt som orsakade stopp för en viss tråd. Tråden stannar och väntar så länge som den är skriven i parametern. Och sedan kommer det att börja. Den här tråden kan inte starta av sig själv. För att återuppta arbetet finns det metoder för att meddela och meddela alla. Ett anrop till notify() eller notifyAll() måste spela någon annan tråd. Med wait() kan du stoppa flera trådar och starta alla trådar med notifyAll() . Om flera trådar stoppades och notify() anropades är det omöjligt att säga exakt vilken tråd som kommer att återuppta denna metod. Om det inte finns några väntande trådar på wait()- metoden, händer ingenting när notify() ellernotifyAll() anropas. En tråd kan anropa metoderna wait() eller notify() på ett visst objekt endast om den för närvarande har ett lås på det objektet. wait() , notify() och notifyAll() ska bara anropas från synkroniserad kod.

Wait() metod exempel

Här har vi ett av de mest populära exemplen som illustrerar hur metoden fungerar. Låt oss säga att vi har en butik, en producent och en konsument. Tillverkaren överför vissa produktionsprodukter till butiken, varefter konsumenten kan ta dem. Låt tillverkaren ha att producera 8 varor, respektive, konsumenten måste köpa dem alla. Men samtidigt får inte mer än 6 artiklar finnas på lagret samtidigt. För att lösa detta problem använder vi metoderna wait() och notify() . Låt oss definiera tre klasser: Market , Manufacturer och Client . Metoden Manufacturer in the run() lägger till 8 produkter till Market - objektet med hjälp av dessput() metoden. Klienten i run() -metoden i en loop anropar get-metoden för Market -objektet för att få dessa produkter. Put and get-metoderna för Market -klassen är synkroniserade. För att spåra förekomsten av varor i klassen Market kontrollerar vi värdet på artikelvariabeln. Metoden get () för att hämta en produkt bör bara aktiveras om det finns minst en produkt. Därför kontrollerar vi i get-metoden om produkten saknas. Om objektet inte är tillgängligt anropas metoden wait() . Denna metod släpper Market -objektets monitor och blockerar get-metoden tills notify()metoden anropas på samma monitor. När ett objekt läggs till i put() -metoden och notify() anropas, får metoden get() övervakaren. Efter det får vår kund en vara. För att göra detta visas ett meddelande och värdet på objektet minskas. Slutligen signalerar notify() -metoden att put()- metoden ska fortsätta. I put()- metoden fungerar liknande logik, bara nu borde put() -metoden fungera om det inte finns fler än 6 produkter på marknaden .
class Market {

   private int item = 0;

   public synchronized void get() {
       //here we use wait() method
       while (item < 1) {
           try {
               wait();
           }
           catch (InterruptedException e) {
           }
       }
       item--;
       System.out.println("A client has bought 1 item...");
       System.out.println("Items quantity in Market warehouse... " + item);
       notify();
   }

   public synchronized void put() {
       //here we use wait() method when the Warehouse is full
       while (item >= 6) {
           try {
               wait();
           }
           catch (InterruptedException e) {
           }
       }
       item ++;
       System.out.println("Manufacturer has added 1 more item...");
       System.out.println("Now there are " + item + " items in Warehouse" );
       notify();
   }
}

class Manufacturer implements Runnable {

   Market market;

   Manufacturer(Market market) {
       this.market = market;
   }


   public void run() {
       for (int i = 0; i < 8; i++) {
           market.put();
       }
   }
}

class Client implements Runnable {

   Market market;
   Client(Market market) {
       this.market = market;
   }
   public void run() {
       for (int i = 0; i < 8; i++) {
           market.get();
       }
   }
}
//wait() method test class
public class WaitTest {
   public static void main(String[] args) {

       Market market = new Market();
       Manufacturer manufacturer = new Manufacturer(market);
       Client client = new Client(market);
       new Thread(manufacturer).start();
       new Thread(client).start();
   }
}
Här, med hjälp av wait() i get()- metoden, väntar vi på att tillverkaren ska lägga till ett nytt objekt. Och efter att ha lagt till ringer vi notify() , som för att säga att en plats har blivit ledig på Warehouse , och du kan lägga till fler. I put()- metoden, med hjälp av wait() , väntar vi på frigörandet av utrymme på Warehouse . När utrymmet är ledigt lägger vi till objektet, notify() startar tråden och klienten kan hämta objektet. Här är resultatet av vårt program:
Tillverkaren har lagt till 1 objekt till... Nu finns det 1 artiklar i Warehouse Tillverkaren har lagt till 1 objekt till... Nu finns det 2 artiklar i Warehouse Manufacturer har lagt till 1 objekt till... Nu finns det 3 artiklar i Warehouse Manufacturer har lagt till 1 objekt till... Nu finns det 4 artiklar i Warehouse Manufacturer har lagt till 1 objekt till... Nu finns det 5 artiklar i Warehouse Manufacturer har lagt till 1 objekt till... Nu finns det 6 artiklar i Warehouse En kund har köpt 1 artikel... Antal artiklar i Market lager... 5 En kund har köpt 1 vara... Antal artiklar i Market lager... 4 En kund har köpt 1 vara... Antal artiklar i Market lager... 3 En kund har köpt 1 vara... Antal artiklar i Market lager... 2 En kund har köpt 1 vara... Antal artiklar i Market lager... 1 En kund har köpt 1 vara... Antal artiklar i Market lager ...0 Tillverkare har lagt till 1 objekt till... Nu finns det 1 artiklar i Warehouse Tillverkaren har lagt till 1 objekt till... Nu finns det 2 artiklar i Warehouse En kund har köpt 1 vara... Antal artiklar i Market lager... 1 En kund har köpt 1 vara... Antal artiklar i Market lager... 0 Processen avslutad med exit kod 0
Kommentarer
  • Populär
  • Ny
  • Gammal
Du måste vara inloggad för att lämna en kommentar
Den här sidan har inga kommentarer än