--- espera hilos utilizando notifiquen espera paradigma (), notify ()

1. Espere a que un hilo para adquirir el objeto de bloqueo, llame al método wait (), renunciar a la cerradura, en la cola de espera

2. El hilo de notificación para adquirir el objeto de bloqueo, llame al objeto de notificar () método

3. hilo de espera recibe la notificación de la cola de espera de la cola de sincronización para entrar en el estado bloqueado

4. Después de la notificación hilo libera el bloqueo, a la espera de un hilo para obtener un bloqueo para continuar


Un ejemplo de código:

Que espera la entidad receptora

public class Express {

public final static StringCITY ="BeiJing";

private int km;/*运输里程数*/

private Stringsite;/*到达地点*/

public Express() {

}

public Express(int km, String site) {

this.km = km;

this.site = site;

}

/* 变化公里数,然后通知处于wait状态并需要处理公里数的线程进行业务处理*/

public synchronized void changeKm(){

this.km =101;

notify();

}

/* 变化地点,然后通知处于wait状态并需要处理地点的线程进行业务处理*/

public  synchronized  void changeSite(){

this.site ="BeiJing";

notifyAll();

}

/*线程等待公里的变化*/

public synchronized void waitKm(){

while(this.km<100){

try {

wait();

System.out.println("Check Site thread[" +Thread.currentThread().getId()+"] is be notified");

}catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("the Km is "+this.km+",I will change db");

}

/*线程等待目的地的变化*/

public synchronized void waitSite(){

while(this.site.equals(CITY)){//快递到达目的地

try {

wait();

System.out.println("Check Site thread["+Thread.currentThread().getId()+"] is be notified");

}catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("the site is "+this.site+",I will call user");

}

}

Cambios modifican los datos hilo abierto

public class TestWN {

private static Expressexpress =new Express(0,Express.CITY);

/*检查里程数变化的线程,不满足条件,线程一直等待*/

private static class CheckKmextends Thread{

@Override

public void run() {

express.waitKm();

}

}

/*检查地点变化的线程,不满足条件,线程一直等待*/

private static class CheckSiteextends Thread{

@Override

public void run() {

express.waitSite();

}

}

public static void main(String[] args)throws InterruptedException {

for(int i=0;i<3;i++){

new CheckSite().start();

}

for(int i=0;i<3;i++){

new CheckKm().start();

}

Thread.sleep(1000);

express.changeKm();//快递地点变化

}

}

 

 

Lo anterior sólo se representan el punto de vista del aprendizaje individual, esperamos proporcionar una referencia de aprendizaje

Publicado 18 artículos originales · ganado elogios 4 · Vistas 139

Supongo que te gusta

Origin blog.csdn.net/weixin_42081445/article/details/104846915
Recomendado
Clasificación