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

Wait()-metoden i Java

Publisert i gruppen
I denne artikkelen skal vi se på wait()- metoden for å kontrollere tråden, og notify() / notifyAll()- metodene. Disse metodene er definert i basisklassen java.lang.Object , og følgelig gir arvemekanismene som er i Java disse metodene til absolutt alle klasser. Det vil si at når du lager din egen klasse og dens objekter, kan du alltid kalle disse metodene.

Hvordan fungerer metodene wait() og notify()/notifyAll()?

  • vent() . kort sagt, denne metoden frigir monitoren og setter den kallende tråden i ventetilstand til en annen tråd kaller notify() / notifyAll()- metoden;
  • varsle() . Fortsetter arbeidet med en tråd hvis wait()-metode tidligere ble kalt;
  • notifyAll()- metoden gjenopptar alle tråder som tidligere har fått sin wait() -metode kalt.
La oss nå se nærmere på wait() -metoden. Objektklassen inneholder tre alternativer for denne metoden :
  • public final native void wait(lang timeoutMillis) kaster InterruptedException ; Det får den gjeldende tråden til å vente til den blir vekket. Vanligvis skjer det ved å bli varslet eller avbrutt, eller inntil en viss sanntid har gått.

  • public final void wait() kaster InterruptedException . Det er ingen tilfeldighet at vi skrev en metode uten parametere som den andre. Faktisk, hvis du ser på koden, refererer den til den første varianten av metoden, den har bare 0L-argumentet.

  • offentlig endelig ventetid (lang tidsavbrudd, int nanos) . Får den gjeldende tråden til å vente til den vekkes, vanligvis ved å bli varslet eller avbrutt, eller til en viss mengde sanntid har gått.

wait ()- metoden er ment å suspendere den kallende tråden. Hva betyr det? Disse metodene tilhører klassen. Basert på klassen lager du et objekt. Objekter finnes i noen tråder. Det vil si at objekter lages i noen tråder. I tråden som dette objektet fungerer i, hvis du kaller wait() i det, vil dette føre til at denne tråden stopper. Selve objektet fungerer som en slags monitor. Hva er det? Det er klart at du kan lage forskjellige objekter og alle vil inneholde wait()metode. Det er en forståelse av hvilket objekt som forårsaket stopp av en bestemt tråd. Tråden stopper og vil vente så lenge den er skrevet i parameteren. Og så vil det starte. Denne tråden kan ikke starte seg selv. For å gjenoppta arbeidet, er det varsle og varsle Alle metoder. Et kall til notify() eller notifyAll() må spille av en annen tråd. Med wait() , kan du stoppe flere tråder, og starte alle tråder med notifyAll() . Hvis flere tråder ble stoppet og notify() ble kalt, er det umulig å si nøyaktig hvilken tråd som vil gjenoppta denne metoden. Hvis det ikke er noen ventende tråder på wait()- metoden, skjer det ingenting når notify() ellernotifyAll() kalles. En tråd kan kalle wait()- eller notify()- metodene på et bestemt objekt bare hvis den for øyeblikket har en lås på det objektet. wait() , notify() , og notifyAll() skal bare kalles fra synkronisert kode.

Eksempel på Wait()-metode

Her har vi et av de mest populære eksemplene som illustrerer hvordan metoden fungerer. La oss si at vi har en butikk, en produsent og en forbruker. Produsenten overfører noen produksjonsprodukter til butikken, hvoretter forbrukeren kan ta dem. La produsenten ha til å produsere henholdsvis 8 varer, forbrukeren må kjøpe dem alle. Men samtidig kan ikke mer enn 6 varer være på lageret samtidig. For å løse dette problemet bruker vi metodene wait() og notify() . La oss definere tre klasser: marked , produsent og klient . Produsent i run() -metoden legger til 8 produkter til Market- objektet ved å bruke sinput() metoden. Klienten i run() -metoden i en loop kaller get-metoden til Market- objektet for å få disse produktene. Put and get-metodene til Market- klassen er synkronisert. For å spore tilstedeværelsen av varer i markedsklassen , sjekker vi verdien av varevariabelen. Get () -metoden for å få et produkt skal bare utløses hvis det er minst ett produkt. Derfor sjekker vi i get-metoden om produktet mangler. Hvis elementet ikke er tilgjengelig, kalles wait()- metoden. Denne metoden frigir Market -objektets monitor og blokkerer get-metoden til notify()metoden kalles på samme monitor. Når et element legges til i put()- metoden og notify() kalles, får get()- metoden monitoren. Etter det mottar vår klient en vare. For å gjøre dette vises en melding, og verdien av varen reduseres. Til slutt signaliserer metodekallet notify() at put()- metoden skal fortsette. I put()- metoden fungerer lignende logikk, bare nå bør put()- metoden fungere hvis det ikke er mer enn 6 produkter i markedet .
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();
   }
}
Her, ved å bruke wait() i get()- metoden, venter vi på at produsenten skal legge til et nytt element. Og etter å ha lagt til, ringer vi notify() , som for å si at ett sted har blitt ledig på Lageret , og du kan legge til flere. I put()- metoden, ved å bruke wait() , venter vi på frigjøring av plass på Warehouse . Etter at plassen er ledig legger vi til varen, notify() starter tråden og klienten kan hente varen. Her er resultatet av programmet vårt:
Produsenten har lagt til 1 vare til... Nå er det 1 varer i lageret Produsenten har lagt til 1 vare til... Nå er det 2 varer i lageret Produsenten har lagt til 1 vare til... Nå er det 3 varer i lageret Produsenten har lagt til 1 vare til... Nå er det 4 varer i Warehouse Manufacturer har lagt til 1 varer til... Nå er det 5 varer i Warehouse Manufacturer har lagt til 1 varer til... Nå er det 6 varer i Warehouse En kunde har kjøpt 1 vare... Antall varer i Market lager... 5 En kunde har kjøpt 1 vare... Antall varer i Market lager... 4 En kunde har kjøpt 1 vare... Antall varer i Market lager... 3 En kunde har kjøpt 1 vare... Antall varer i Market lager... 2 En kunde har kjøpt 1 vare... Antall varer i Market lager... 1 En kunde har kjøpt 1 vare... Antall varer i Market lager ...0 Produsent har lagt til 1 vare til... Nå er det 1 varer i lageret Produsent har lagt til 1 varer til... Nå er det 2 varer i lageret En kunde har kjøpt 1 vare... Antall varer i markedslageret... 1 En klient har kjøpt 1 vare... Antall varer i Market-lageret... 0 Prosessen avsluttet med utgangskode 0
Kommentarer
  • Populær
  • Ny
  • Gammel
Du må være pålogget for å legge igjen en kommentar
Denne siden har ingen kommentarer ennå