Java代码(使用了2个内部类):

  1. package Threads;
  2.  
  3. import java.util.LinkedList;
  4.  
  5. /**
  6. * Created by Frank
  7. */
  8. public class ProdCons {
  9. protected LinkedList<Object> list = new LinkedList<>();
  10. protected int max;
  11. protected boolean done = false;
  12.  
  13. public static void main(String[] args) throws InterruptedException {
  14. ProdCons prodCons = new ProdCons(100, 3, 4);
  15. Thread.sleep(5 * 1000);
  16. synchronized (prodCons.list) {
  17. prodCons.done = true;
  18. try {
  19. prodCons.notifyAll();
  20. } catch (Exception ex) {
  21. }
  22. }
  23. }
  24.  
  25. private ProdCons(int maxThreads, int nP, int nC) {
  26. this.max = maxThreads;
  27. for (int i = 0; i < nP; i++) {
  28. new Producer().start();
  29. }
  30. for (int i = 0; i < nC; i++) {
  31. new Consumer().start();
  32. }
  33. }
  34.  
  35. class Producer extends Thread {
  36. public void run() {
  37. while (true) {
  38. Object justProduced = null;
  39. try {
  40. justProduced = getObj();
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. synchronized (list) {
  45. while (list.size() == max) {
  46. try {
  47. list.wait();
  48. } catch (InterruptedException e) {
  49. System.out.println("Producer INTERRUPTED");
  50. }
  51. }
  52. list.addFirst(justProduced);
  53. list.notifyAll();
  54. System.out.println("Produced 1;List size now " + list.size());
  55. if (done) {
  56. break;
  57. }
  58. }
  59. }
  60. }
  61. }
  62.  
  63. class Consumer extends Thread {
  64. public void run() {
  65. while (true) {
  66. Object object = null;
  67. synchronized (list) {
  68. if (list.size() == 0) {
  69. try {
  70. list.wait();
  71. } catch (InterruptedException e) {
  72. System.out.println("Consumer INTERRUPTED");
  73. }
  74. }
  75. if (list.size() > 0) {
  76. object = list.removeLast();
  77. }
  78. list.notifyAll();
  79. System.out.println("List size now " + list.size());
  80. if (done) {
  81. break;
  82. }
  83. }
  84. if (null != object) {
  85. System.out.println("Consuming object " + object);
  86. }
  87. }
  88. }
  89. }
  90.  
  91. private Object getObj() throws InterruptedException {
  92. Thread.sleep(1000);
  93. return new Object();
  94. }
  95. }

Java通过wait()和notifyAll()方法实现线程间的通信的更多相关文章

  1. Object类中wait带参方法和notifyAll方法和线程间通信

    notifyAll方法: 进入到Timed_Waiting(计时等待)状态有两种方式: 1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态 2. ...

  2. Java核心知识点学习----多线程并发之线程间的通信,notify,wait

    1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...

  3. Object类中wait代餐方法和notifyAll方法和线程间通信

    Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...

  4. Java并发读书笔记:如何实现线程间正确通信

    目录 一.synchronized 与 volatile 二.等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 三.等待通知典型 生产者消费者模型 ...

  5. 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)

    线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...

  6. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  7. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  8. 【转】Java学习---线程间的通信

    [原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...

  9. Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信

    Condition: condition接口描述了可能会与锁有关的条件变量.这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个lock可能与多个Co ...

随机推荐

  1. C# Linq获取两个List或数组的差集交集

      List<); list1.Add(); list1.Add(); List<); list2.Add(); list2.Add(); //得到的结果是4,5 即减去了相同的元素. L ...

  2. 伯努利分布、二项分布、Beta分布、多项分布和Dirichlet分布与他们之间的关系,以及在LDA中的应用

    在看LDA的时候,遇到的数学公式分布有些多,因此在这里总结一下思路. 一.伯努利试验.伯努利过程与伯努利分布 先说一下什么是伯努利试验: 维基百科伯努利试验中: 伯努利试验(Bernoulli tri ...

  3. jcseg-1.8.7版本发布 - 多配置适应+完整开发帮助文档

    jcseg是使用java开发的一款开源中文分词器, 并且提供了最新版本的lucene和solr分词接口. jcseg 1.8.7版本发布了: 1. 更改了内部设计, 加入JcsegTaskConfig ...

  4. IE9版本以下ajax 跨域问题解决

    ajax跨域请求数据在谷歌火狐我本地IE11都是没问题的. 让测试就发现问题了,IE8下请求不到数据,然后我查看一下自己写的js看有没有不兼容问题,可是都没有啊,为什么就请求不到呢. 我把ajax的e ...

  5. ASP.NET MVC:无法向会话状态服务器发出会话状态请求

    ylbtech-Error-ASP.NET MVC: 无法向会话状态服务器发出会话状态请求 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Service (ASP.NET ...

  6. c++ 如何编写接口类(interface)

    接口类简介: 接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法. 用c++实现接口类时需要 ...

  7. MultipleRegularExpressionAttribute MVC中扩展自定义验证规则

    好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的.这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 ...

  8. iOS开发-音乐播放(AVAudioPlayer)

    现在的手机的基本上没有人不停音乐的,我们无法想象在一个没有声音的世界里我们会过的怎么样,国内现在的主流的主流网易云音乐,QQ音乐,酷狗,虾米,天天基本上霸占了所有的用户群体,不过并没有妨碍大家对音乐的 ...

  9. http://blog.csdn.net/u014595019/article/details/52805444

    http://blog.csdn.net/u014595019/article/details/52805444 tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码 ...

  10. 解决Ubuntu/debian的Apt-get 由于依赖关系安装失败的问题

    The following packages have unmet dependencies: libssl-dev: Depends: libssl0.9.8 (= 0.9.8k-7ubuntu8) ...