多线程学习笔记3-线程间的通信(1)

xiaoxiao2021-02-28  109

线程间通信(1) 等待/通知机制 wait()notify()方法 方法wait是使当前执行代码的进程进行等待,wait()方法是Object类的方法,该方法将当前线程置入"预执行队列",并且在wait() 所在的代码行停止执行,直到接到通知或被中断为止,在调用wait之前,线程必须获得该对象的对象级别锁,即只能在同步代码块 中调用wait方法,如果调用wait时没有持有适当的锁,抛出runtimeException异常 方法notify也要在同步代码块中使用,该方法用于通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则随机挑 出一个呈wait状态的线程,对齐发出notify,使它等待获取该对象的对象锁,需要说明的是,执行notify方法后,当前线程不会马上 释放该对象锁,呈wait状态的线程也不会马上获取对象的锁要等执行notify方法的线程将程序执行完,线程锁才会释放 一句话:wait使线程等待,notify使线程继续运行 例子(生产者消费者): 一个用于被生产和消费的类: public class ValueObject { public static String value = ""; } 一个用于生产的类: public class P { private String lock; public P(String lock){ this.lock = lock; } public void setValue(){ try{ synchronized(lock){ if(!ValueObject.value.equals("")){ lock.wait(); } String value = System.currentTimeMillis()+"_"+System.nanoTime(); System.out.println("生产的值是"+value); ValueObject.value = value; lock.notifyAll(); } }catch(InterruptedException e){ e.printStackTrace(); } } } 一个用于消费的类: public class C { private String lock; public C(String lock){ this.lock = lock; } public void getValue(){ try{ synchronized(lock){ if(ValueObject.value.equals("")){ lock.wait(); } System.out.println("获得的值是"+ValueObject.value); ValueObject.value = ""; lock.notify(); } }catch(InterruptedException e){ e.printStackTrace(); } } } 生产者线程: public class ThreadP extends Thread { private P p; public ThreadP(P p){ this.p = p; } @Override public void run() { // TODO Auto-generated method stub while(true){ p.setValue(); } } } 消费者线程: public class C { private String lock; public C(String lock){ this.lock = lock; } public void getValue(){ try{ synchronized(lock){ if(ValueObject.value.equals("")){ lock.wait(); } System.out.println("获得的值是"+ValueObject.value); ValueObject.value = ""; lock.notify(); } }catch(InterruptedException e){ e.printStackTrace(); } } } 多生产与多消费:假死问题的产生 由于notify的不确定性导致,notify唤醒的是相同锁的同步代码块的线程,但是具体哪一个线程是不确定的 比如多个消费者可能会唤醒消费者线程

转载请注明原文地址: https://www.6miu.com/read-44047.html

最新回复(0)