Object类wait及notify方法原理实例解析

时间:2021-05-20

Object类中的wait和notify方法(生产者和消费者模式)  不是通过线程调用

  • wait():    让正在当前对象上活动的线程进入等待状态,无期限等待,直到被唤醒为止
  • notify():    让正在当前对象上等待的线程唤醒
  • notifyAll():   唤醒当前对象上处于等待的所有线程

生产者和消费者模式 生产线程和消费线程达到均衡

wait方法和notify方法建立在synchronized线程同步的基础之上

  • wait方法:   释放当前对象占有的锁
  • notify方法:   通知,不会释放锁

实现生产者和消费者模式  仓库容量为10

代码如下

import java.util.ArrayList;public class Test_14 { public static void main(String[] args) { ArrayList list = new ArrayList(); Thread t1 = new Thread(new ProducerThread(list)); t1.setName("producer"); Thread t2 = new Thread(new ConsumerThread(list)); t2.setName("consumer"); t1.start(); t2.start(); }}//生产者线程class ProducerThread implements Runnable{ private ArrayList arrayList; public ProducerThread(ArrayList arrayList) { this.arrayList = arrayList; } @Override public void run() { while (true) { synchronized (arrayList) { if (arrayList.size() > 9){ try { arrayList.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } arrayList.add(new Object()); System.out.println(Thread.currentThread().getName() + "---> 生产" + "---库存" + arrayList.size()); arrayList.notify(); } } }}//消费者线程class ConsumerThread implements Runnable{ private ArrayList arrayList; public ConsumerThread(ArrayList arrayList) { this.arrayList = arrayList; } @Override public void run() { while (true){ synchronized (arrayList){ if (arrayList.size() < 9){ try { arrayList.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } arrayList.remove(0); System.out.println(Thread.currentThread().getName() + "---> 消费" + "---库存" + arrayList.size()); arrayList.notify(); } } }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章