Java Thread prisni, njoftoni dhe njoftoni të gjithë Shembulli
Klasa Object në java përmban tre metoda përfundimtare që lejojnë thread-ët të komunikojnë rreth statusit të bllokimit të një burimi. Këto metoda janë prit(), notify() dhe notifyAll(). Kështu që sot do të shikojmë të presim, të njoftojmë dhe të njoftojmë të gjithë në programin java.
prisni, njoftoni dhe njoftoni të gjithë në Java
prisni
Metodat e pritjes së objekteve kanë tre variante, njëra e cila pret pafundësisht që ndonjë thread tjetër të thërrasë notify ose notifyAll metodë në objekt për të zgjuar thread-in aktual. Dy variancat e tjera e vendosin fillin aktual në pritje për një kohë specifike përpara se të zgjohen.
njoftoj
Metoda notify zgjon vetëm një thread që pret në objekt dhe ajo fillesë fillon ekzekutimin. Pra, nëse ka shumë fije që presin për një objekt, kjo metodë do të zgjojë vetëm njërën prej tyre. Zgjedhja e fillit për zgjim varet nga zbatimi i sistemit operativ të menaxhimit të fijeve.
njoftoj të gjithë
Metoda notifyAll zgjon të gjitha temat që presin në objekt, megjithëse cili do të përpunojë i pari varet nga zbatimi i OS. Këto metoda mund të përdoren për të zbatuar problemin e konsumatorit prodhues ku thread-et e konsumatorit janë duke pritur për objektet në Radhë dhe thread-et e prodhuesit vendosin objektin në radhë dhe njoftojnë fijet e pritjes. Le të shohim një shembull ku shumë threads punojnë në të njëjtin objekt dhe ne përdorim metodat e pritjes, njoftimit dhe njoftimit të gjitha.
Mesazh
Një klasë java bean në të cilën do të funksionojnë temat dhe do të thërrasin metodat e pritjes dhe njoftimit.
package com.journaldev.concurrency;
public class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
public void setMsg(String str) {
this.msg=str;
}
}
Kamarier
Një klasë që do të presë që temat e tjera të thërrasin metodat e njoftimit për të përfunduar përpunimin e saj. Vini re se filli i kamarierit zotëron monitorin në objektin e Mesazhit duke përdorur bllokun e sinkronizuar.
package com.journaldev.concurrency;
public class Waiter implements Runnable{
private Message msg;
public Waiter(Message m){
this.msg=m;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (msg) {
try{
System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis());
msg.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis());
//process the message now
System.out.println(name+" processed: "+msg.getMsg());
}
}
}
Njoftuesi
Një klasë që do të përpunojë në objektin Message dhe më pas do të thërrasë metodën e njoftimit për të zgjuar temat që presin për objektin Message. Vini re se blloku i sinkronizuar përdoret për të zotëruar monitorin e objektit Message.
package com.journaldev.concurrency;
public class Notifier implements Runnable {
private Message msg;
public Notifier(Message msg) {
this.msg = msg;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name+" started");
try {
Thread.sleep(1000);
synchronized (msg) {
msg.setMsg(name+" Notifier work done");
msg.notify();
// msg.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Prisni NotifyTest
Klasa e testimit që do të krijojë fije të shumta të Waiter dhe Notifier dhe do t'i nisë ato.
package com.journaldev.concurrency;
public class WaitNotifyTest {
public static void main(String[] args) {
Message msg = new Message("process it");
Waiter waiter = new Waiter(msg);
new Thread(waiter,"waiter").start();
Waiter waiter1 = new Waiter(msg);
new Thread(waiter1, "waiter1").start();
Notifier notifier = new Notifier(msg);
new Thread(notifier, "notifier").start();
System.out.println("All the threads are started");
}
}
Kur do të thërrasim programin e mësipërm, do të shohim daljen më poshtë, por programi nuk do të përfundojë sepse ka dy threads që presin në objektin Message dhe metoda notify() ka zgjuar vetëm njërën prej tyre, thread tjetër është ende në pritje për t'u njoftuar.
waiter waiting to get notified at time:1356318734009
waiter1 waiting to get notified at time:1356318734010
All the threads are started
notifier started
waiter waiter thread got notified at time:1356318735011
waiter processed: notifier Notifier work done
Nëse komentojmë thirrjen notify() dhe anulojmë thirrjen notifyAll() në klasën Notifier, më poshtë do të jetë dalja e prodhuar.
waiter waiting to get notified at time:1356318917118
waiter1 waiting to get notified at time:1356318917118
All the threads are started
notifier started
waiter1 waiter thread got notified at time:1356318918120
waiter1 processed: notifier Notifier work done
waiter waiter thread got notified at time:1356318918120
waiter processed: notifier Notifier work done
Meqenëse metoda notifyAll() zgjon të dyja thread-et dhe programi Waiter përfundon dhe përfundon pas ekzekutimit. Kjo është e gjitha për të pritur, njoftoni dhe njoftoni të gjithë në java.