KodeGym/Blog Jawa/Acak/Enteni() Metode ing Jawa
John Squirrels
tingkat
San Francisco

Enteni() Metode ing Jawa

Diterbitake ing grup
Ing artikel iki, kita bakal katon ing Enteni () cara kanggo ngontrol thread, lan notify () / notifyAll () cara. Cara kasebut ditetepake ing kelas dhasar java.lang.Object lan, kanthi mangkono, mekanisme warisan sing ana ing Jawa nyedhiyakake metode kasebut kanggo pancen kabeh kelas. Sing, nalika nggawe kelas dhewe lan obyek, sampeyan bisa tansah nelpon cara iki.

Kepiye cara ngenteni () lan notify () / notifyAll ()?

  • ngenteni () . ing cendhak, cara iki nerbitaké monitor lan nempatno thread nelpon menyang negara Enteni nganti thread liyane nelpon notify () / notifyAll () cara;
  • ngabari () . Nerusake karya thread sing ngenteni () cara sadurunge disebut;
  • notifyAll () cara nerusake kabeh Utas sing sadurunge wis Enteni () cara disebut.
Saiki ayo dideleng kanthi tliti babagan metode ngenteni () . Kelas Obyek ngemot telung opsi kanggo metode iki:
  • public final void void wait(long timeoutMillis) mbalang InterruptedException ; Iki nyebabake thread saiki ngenteni nganti tangi. Biasane kedadeyan kanthi diwenehi kabar utawa diselani, utawa nganti sawetara wektu nyata wis liwati.

  • public final void wait () mbuwang InterruptedException . Ora ana kebetulan yen kita nulis metode tanpa paramèter minangka sing nomer loro. Nyatane, yen sampeyan ndeleng kode kasebut, nuduhake varian pisanan saka metode kasebut, mung duwe argumen 0L.

  • ngenteni pungkasan umum (wektu entek dawa, int nanos) . Nimbulake utas saiki ngenteni nganti tangi, biasane diwenehi kabar utawa diselani, utawa nganti sawetara wektu nyata wis liwati.

Enteni () cara dimaksudaké kanggo nundha thread nelpon. Iki artine apa? Cara kasebut kalebu kelas. Adhedhasar kelas, sampeyan nggawe obyek. Obyek ana ing sawetara utas. Yaiku, obyek digawe ing sawetara utas. Ing thread kang obyek iki dianggo, yen sampeyan nelpon ngenteni () ing, iki bakal mimpin kanggo kasunyatan sing thread iki bakal mandheg. Objek kasebut dhewe minangka jinis monitor. Opo kuwi? Cetha yen sampeyan bisa nggawe macem-macem obyek lan kabeh bakal ngemot tunggu ()cara. Ana pangerten babagan obyek sing nyebabake mandheg saka benang tartamtu. Utas mandheg lan bakal ngenteni nganti ditulis ing parameter. Banjur bakal diwiwiti. Utas iki ora bisa diwiwiti dhewe. Kanggo nerusake karya, ana cara notify lan notifyAll. Telpon kanggo notifikasi () utawa notifyAll () kudu muter sawetara thread liyane. Kanthi wait () , sampeyan bisa mungkasi sawetara thread, lan miwiti kabeh thread karo notifyAll () . Yen sawetara Utas wis mandegake lan notifikasi () diarani, iku mokal kanggo ngomong persis thread bakal nerusake cara iki. Yen ora ana Utas nunggu ing Enteni () cara, banjur boten mengkono nalika notifikasi () utawanotifyAll () diarani. Utas bisa nelpon Enteni () utawa ngabari () cara ing obyek tartamtu mung yen saiki wis kunci ing obyek. ngenteni () , notify () , lan notifyAll () mung kudu disebut saka kode diselarasake.

Tuladha metode Wait().

Ing kene kita entuk salah sawijining conto sing paling populer sing nggambarake cara kerjane. Ayo kita duwe toko, produser, lan konsumen. Pabrikan ngirim sawetara produk produksi menyang toko, sawise konsumen bisa njupuk. Supaya pabrikan kudu ngasilake 8 barang, konsumen kudu tuku kabeh. Nanging ing wektu sing padha, ora luwih saka 6 item bisa ing gudang ing wektu sing padha. Kanggo ngatasi masalah iki, kita nggunakake Enteni () lan ngabari () cara. Ayo nemtokake telung kelas: Pasar , Produsen lan Klien . Produsen ing cara roto ( ) nambah 8 produk kanggo obyek Market nggunakake sawijiningmetode put() . Klien ing cara roto () ing daur ulang nelpon cara njaluk saka obyek Market kanggo njaluk produk iki. Metode put and get saka kelas Pasar disinkronake. Kanggo nglacak anané barang ing kelas Pasar , kita mriksa nilai variabel item. Cara entuk () kanggo entuk produk mung kudu murub yen paling ora ana siji produk. Mulane, ing cara njaluk, kita mriksa yen produk ilang. Yen item ora kasedhiya, Enteni () cara disebut. Cara iki ngeculake monitor obyek Pasar lan mblokir metode entuk nganti notifikasi ()cara disebut ing monitor padha. Nalika item ditambahake ing cara sijine () lan ngabari () disebut, njaluk () cara monitor. Sawise iku, klien kita nampa item. Kanggo nindakake iki, pesen ditampilake, lan nilai item dikurangi. Akhire, notify () cara nelpon sinyal cara put () terus. Ing metode put () , logika sing padha bisa digunakake, mung saiki metode put () kudu bisa digunakake yen ora ana luwih saka 6 produk ing Pasar .
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();
   }
}
Kene, nggunakake Enteni () ing njaluk () cara, kita nunggu Produsèn kanggo nambah item anyar. Lan sawise nambah, kita nelpon notifikasi () , kaya ngomong sing siji panggonan wis dadi free ing Warehouse , lan sampeyan bisa nambah liyane. Ing cara sijine () , nggunakake ngenteni () , kita nunggu release saka papan ing Warehouse . Sawise papan free, kita nambah item, ngabari () miwiti Utas lan Klien bisa Pick munggah item. Mangkene output program kita:
Produsen wis nambah 1 item maneh ... Saiki ana 1 item ing Gudang Produsen wis nambah 1 item maneh ... Saiki ana 2 item ing Gudang Produsen wis nambah 1 item maneh ... Saiki ana 3 item ing Gudang Produsen wis nambah 1 item maneh ... Saiki ana 4 item ing Gudang Produsen wis nambah 1 item maneh ... Saiki ana 5 item ing Gudang Produsen wis nambah 1 item maneh ... Saiki ana 6 item ing Gudang A klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 5 Klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 4 Klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 3 Klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 2 Klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 1 Klien wis tuku 1 barang... Jumlah barang ing gudang Pasar ...0 Produsen wis nambah 1 barang maneh... Saiki ana 1 barang ing Gudang Produsen wis nambahake 1 barang maneh... Saiki ana 2 barang ing Gudang A klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 1 Klien wis tuku 1 barang... Jumlah barang ing gudang Pasar... 0 Proses rampung nganggo kode metu 0
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar