Java 多线程(二)线程间的通信应用--生产者消费者(未完)
对于多个生产者和消费者。
为什么要定义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 多线程(二)线程间的通信应用--生产者消费者(未完)相关推荐
- java多线程:线程间的通信-生产者和消费者(三)
在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式
一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...
- 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)
线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...
- Java多线程:线程间通信方式
文章目录 Java线程通信 wait().notify().notifyAll() API说明 实现原理 代码实现 await().signal().signalAll() API说明 实现原理 代码 ...
- JAVA多线程之线程间的通信方式
线程间的通信方式 1同步 2while轮询的方式 3waitnotify机制 4管道通信 线程间的通信方式 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通 ...
- java 线程间通信方式_「转」JAVA多线程之线程间的通信方式
1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
- Java多线程:线程间通信之volatile与sychronized
由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...
最新文章
- CCNP ONT LAB之PQ WFQ
- jdk 1结尾和2结尾_“与巢一起工作”的结尾对您意味着什么
- CSDN如何找到自己关注的博客专栏
- keep dark about sth
- Qt Qwdget 汽车仪表知识点拆解2 图像放大
- 【自然框架】稳定版的Demo —— 三:主从表的维护方式
- matlab的小波分析,matlab小波分析步骤是什么 - 全文
- linux万兆网卡驱动下载,Intel英特尔PCIe万兆网卡驱动5.11.3版For Linux(2021年3月5日发布)...
- 扫描仪服务器正在运行中,针对使用 Acrobat 时出现的扫描仪问题的故障排除提示...
- Redis的读写分离
- cmd看excel有多少个子表_如何将一个 Excel 工作簿中的多个工作表合并成一个工作表?...
- 多节点Linux环境打造
- php mpm,PHP使用Apache中的ab测试网站的压力性能及mpm介绍
- win10计算机里的工具在哪里设置,win10系统桌面上添加自带日历小工具的设置办法...
- 好物推荐 | 小明医声家庭健康初体验
- Nginx的优化配置
- 多个换行符\n替换为1个换行
- 史上最易懂——一文详解线性回归算法的纯Python实现
- 2023年软考信息安全工程师备考学习笔记汇总
- 【指纹识别】指纹识别门禁系统【含GUI Matlab源码 1692期】
热门文章
- java实现excel的导入导出(poi详解)
- VirtualBox快照(Snapshot)功能使用及注意事项
- dede扩展数据类型_数据类型,扩展
- 火狐浏览器信息提取工具Dumpzilla
- NGUI从入门到实战第1章开启NGUI学习之旅
- vue 解决跨域 调试_Electron-vue解决跨域
- 龙将加速浏览器_《看门狗:军团》即将开启预载,迅游加速器支持下载和联机加速 18183手机游戏网...
- findcontours函数_opencv轮廓findContoursamp;drawContours
- 计算机反面的考研专业,2018计算机考研:历年准考证打印常见七大问题
- 2字节十六进制浮点数 qt_Qt中如何实现十六进制“41A4 0000”十六进制转为浮点数20.5呢?...