对于多个生产者和消费者。
为什么要定义while判断标记。
原因:让被唤醒的线程再一次判断标记。

为什么定义notifyAll,
因为需要唤醒对方线程。
因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。

启动主类

/** *  */
package threadCommnication;  /** * <p>Title: InputOutputDemo</p> * <p>Description: </p> * <p>Company: </p> * @author 夏 杰 * @date 2015年12月12日 下午8:40:53 * @vesion 1.0
*/
public class ConsumerProducerDemo {  public static void main(String[] args) {  Resource resource = new Resource();  Producer producer = new Producer(resource);  Consumer consumer = new Consumer(resource);  //启动生产者线程  new Thread(producer).start();  //启动消费者线程  new Thread(consumer).start();  }  }  

所要生产的资源

/** *  */
package threadCommnication;  public class Resource {  String name;    private int count = 1;  /** * 标志位 * flag = false 表示没有资源了,要生产,消费者不能取 * flage = ture 表示有资源,不要生产,消费者可以取 */  private boolean flag = false;  public synchronized void  set(String name) throws InterruptedException{  if(flag == true){  //当已经有资源时要等待消费者取走后,才能生产    this.wait();    }else {  //当没有资源时,继续生产  this.name = name+"--"+count++;   System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);  flag = true;  //当生产了后,通知等待的消费者来取  this.notify();  }  }  public synchronized void out() throws InterruptedException{  if(flag == true){  //当有资源时可以取走  System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);  flag = false;  //通知生产者可以继续生产  this.notify();  }else{  //当没有资源时等待生产者生产  this.wait();   }  }
}  

生产者

/** *  */
package threadCommnication;  public class Producer implements Runnable{  private Resource resource;  boolean flag = false;   //保证传入对象唯一性    public Producer(Resource resource) {  this.resource = resource;  }  @Override  public synchronized void run() {  while(true){   try {  resource.set("+商品+");  } catch (InterruptedException e) {  e.printStackTrace();  }  }    }  }  

消费者

/** *  */
package threadCommnication;  public class Consumer  implements Runnable{  private Resource resource;  public Consumer(Resource resource){  //保证传入对象唯一性    this.resource = resource;    }    @Override  public synchronized void run() {  while(true)  {  try {  resource.out();  } catch (InterruptedException e) {  e.printStackTrace();  }  }  }  }  

转载于:https://my.oschina.net/vshcxl/blog/796013

Java 多线程(二)线程间的通信应用--生产者消费者(未完)相关推荐

  1. java多线程:线程间的通信-生产者和消费者(三)

    在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...

  2. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  3. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  4. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  5. Java多线程:线程间通信方式

    文章目录 Java线程通信 wait().notify().notifyAll() API说明 实现原理 代码实现 await().signal().signalAll() API说明 实现原理 代码 ...

  6. JAVA多线程之线程间的通信方式

    线程间的通信方式 1同步 2while轮询的方式 3waitnotify机制 4管道通信 线程间的通信方式 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通 ...

  7. java 线程间通信方式_「转」JAVA多线程之线程间的通信方式

    1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...

  8. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  9. Java多线程:线程间通信之volatile与sychronized

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...

最新文章

  1. CCNP ONT LAB之PQ WFQ
  2. jdk 1结尾和2结尾_“与巢一起工作”的结尾对您意味着什么
  3. CSDN如何找到自己关注的博客专栏
  4. keep dark about sth
  5. Qt Qwdget 汽车仪表知识点拆解2 图像放大
  6. 【自然框架】稳定版的Demo —— 三:主从表的维护方式
  7. matlab的小波分析,matlab小波分析步骤是什么 - 全文
  8. linux万兆网卡驱动下载,Intel英特尔PCIe万兆网卡驱动5.11.3版For Linux(2021年3月5日发布)...
  9. 扫描仪服务器正在运行中,针对使用 Acrobat 时出现的扫描仪问题的故障排除提示...
  10. Redis的读写分离
  11. cmd看excel有多少个子表_如何将一个 Excel 工作簿中的多个工作表合并成一个工作表?...
  12. 多节点Linux环境打造
  13. php mpm,PHP使用Apache中的ab测试网站的压力性能及mpm介绍
  14. win10计算机里的工具在哪里设置,win10系统桌面上添加自带日历小工具的设置办法...
  15. 好物推荐 | 小明医声家庭健康初体验
  16. Nginx的优化配置
  17. 多个换行符\n替换为1个换行
  18. 史上最易懂——一文详解线性回归算法的纯Python实现
  19. 2023年软考信息安全工程师备考学习笔记汇总
  20. 【指纹识别】指纹识别门禁系统【含GUI Matlab源码 1692期】

热门文章

  1. java实现excel的导入导出(poi详解)
  2. VirtualBox快照(Snapshot)功能使用及注意事项
  3. dede扩展数据类型_数据类型,扩展
  4. 火狐浏览器信息提取工具Dumpzilla
  5. NGUI从入门到实战第1章开启NGUI学习之旅
  6. vue 解决跨域 调试_Electron-vue解决跨域
  7. 龙将加速浏览器_《看门狗:军团》即将开启预载,迅游加速器支持下载和联机加速 18183手机游戏网...
  8. findcontours函数_opencv轮廓findContoursamp;drawContours
  9. 计算机反面的考研专业,2018计算机考研:历年准考证打印常见七大问题
  10. 2字节十六进制浮点数 qt_Qt中如何实现十六进制“41A4 0000”十六进制转为浮点数20.5呢?...