上接第一章的线程状态

一个wait和notify的例子:

public class SynchronTest {private int i=1;public static void main(String[] args)  {Object lock = new Object();SynchronTest s = new SynchronTest();SycTest s1 = s.new SycTest(lock);SycTest2 s2 = s.new SycTest2(lock);Thread t1 = new Thread(s1,"Thread 1");Thread t2 = new Thread(s2,"Thread 2");t1.start();t2.start();}class SycTest implements Runnable {private Object lock;public SycTest(Object lock){this.lock = lock;}public synchronized void run() {synchronized (lock){while (i>0){try {System.out.println(Thread.currentThread().getName() + " start" );lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " end" );}}}}class SycTest2 implements Runnable {private Object lock;public SycTest2(Object lock){this.lock = lock;}public void run() {synchronized(lock){try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " start" );i--;lock.notify();System.out.println(Thread.currentThread().getName() + " end" );}}}
}

生产者消费者案例:
下面的例子是生产和消费两个线程并行,当生产到了20个的时候,就暂停,停止生产;当消费到0个的时候就暂停,停止消费;

public class ProducterConsumer {public static void main(String[] args){Object lock = new Object();Pc pc = new Pc(lock);ProducterThread pt = new ProducterThread(pc);ConsumerThread ct = new ConsumerThread(pc);new Thread(pt).start();new Thread(ct).start();}
}class ProducterThread implements Runnable{private Pc pc = null;ProducterThread(Pc pc){this.pc=pc;}@Overridepublic void run() {pc.Producter();}
}class ConsumerThread implements Runnable{private Pc pc = null;ConsumerThread(Pc pc){this.pc=pc;}@Overridepublic void run() {pc.Consumer();}
}class Pc{//初始化对象锁private Object lock;Pc(Object lock){this.lock = lock;}private int j=0;//生产者public  void Producter(){while (true){synchronized (lock){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if(j==20){System.out.println("已经满了");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}else {j++;System.out.println("生产了一个,现在有" + j + "个");lock.notify();}}}}//消费者public  void Consumer(){while (true) {synchronized (lock) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (j == 0) {System.out.println("没有了,需要生产");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}else {j--;System.out.println("消耗了一个,还剩 "+j + "个");lock.notify();}}}}
}

执行结果:

生产了一个,现在有1个
消耗了一个,还剩 0个
没有了,需要生产
生产了一个,现在有1个
生产了一个,现在有2个
生产了一个,现在有3个
生产了一个,现在有4个
消耗了一个,还剩 3个
消耗了一个,还剩 2个
消耗了一个,还剩 1个
消耗了一个,还剩 0个
没有了,需要生产
生产了一个,现在有1个
生产了一个,现在有2个

Java多线程 第三章 等待/通知(wait/notify)机制相关推荐

  1. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

  2. 深入理解java虚拟机gc_jvm GC收集器与内存分配(深入理解java虚拟机第三章)

    jvm GC收集器与内存分配(深入理解java虚拟机第三章) 本篇是<深入理解java虚拟机第三章>的笔记记录. 一 为什么要关注GC和内存分配? 需要排查各种内存溢出.内存泄漏问题时,或 ...

  3. Java 多线程(三):锁(一)

    Java 多线程(三):锁(一) 作者:Grey 原文地址: 博客园:Java 多线程(三):锁(一) CSDN:Java 多线程(三):锁(一) CAS 比较与交换的意思 举个例子,内存有个值是 3 ...

  4. Java学习 第三章 数组(三)排序算法

    ** Java学习 第三章 数组(三)排序算法 ** 主要内容:排序算法.排序算法横向比较.Arrays工具类的使用.数组常见异常 1.数组中涉及到的常见算法:排序算法 1.1 排序算法分类:内部排序 ...

  5. 《啊哈算法》的Java现实 | 第三章:枚举!很暴力

    <啊哈算法>的Java现实 | 第一章:排序. <啊哈算法>的Java现实 | 第二章:栈.队列.链表. <啊哈算法>的Java现实 | 第三章:枚举!很暴力. & ...

  6. Java算法--第三章--排序(14)概述

    Java算法–第三章–排序(14)概述 排序算法的总结: 一.基础排序-----算法评估等级:O(n²) 1.冒泡 谁大谁上,每一轮都把最大的顶到天花板效率太低O(n2)–掌握swap 2.选择排序, ...

  7. Java总结篇系列:Java多线程(三)

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 public cla ...

  8. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  9. java线程安全例子_Java总结篇系列:Java多线程(三)

    本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...

最新文章

  1. java hbase 批量查询数据_HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)...
  2. matlab 点云特征_基于点云的3D障碍物检测
  3. python几何拼贴画_图形几何图形拼贴画
  4. 关于虚数i和欧拉公式对旋转的一点启示
  5. python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...
  6. Web开发过程中需要学习的知识有哪些?
  7. 工作文档化升级为工作列表化
  8. oracle if 和,oracle if 和 case语句的使用
  9. 毕业设计 - 基于JAVA人脸识别管理系统(人脸搜索与人脸库管理)
  10. SQLSERVER - 资源池 ‘internal‘ 没有足够的系统内存来运行此查询。
  11. 关于知云文献翻译出现乱码
  12. 【3D建模制作技巧分享】Zbrush如何将图片转浮雕模型
  13. python实现等量随机分组
  14. Linux上用于Json数据处理并导入Mysql的几个有用Python脚本
  15. tomcat-CNVD-2020-10487-漏洞处理
  16. CTF Web_php_unserialize 详细解题过程
  17. python常见ubr前缀的使用与作用
  18. 用python把学习通导出成绩,未完善
  19. 使用 logrotate 配置 supervisor 进行日志管理按天备份
  20. MySQL——基础知识总结超详细版本(一)

热门文章

  1. []575. Distribute Candies
  2. 【综述 寿命预测】基于机器学习的设备剩余寿命预测方法综述
  3. LBS找外贸客户 外贸怎么找客户
  4. 关于融云聊天室KV 值的正确使用
  5. C#FFmpeg视频采集与推送RTMP服务器代码思路整理
  6. ACM程序设计大赛概况
  7. Java银行柜员业务绩效考核系统(含源码+论文+答辩PPT等)
  8. 案例|全球蛙,如何从山西“跳”到全国?
  9. 使用PHP将任意格式的日期转换为Unix时间戳
  10. perl和python各自擅长的领域