Java多线程㈣—①线程间通讯(生产者及消费者)
来源:互联网 发布:淘宝众筹 编辑:程序博客网 时间:2024/05/29 07:12
在线程操作中有一个经典的案例程序,即生产者和消费者问题,生产者不断生产,消费者不断取走生产者生产的产品。
假设:有两个线程,一个线程负责生产产品,一个线程负责消费产品。其中产品是两个线程处理的同一资源。由于线程的不确定性,所以会存在一下两点问题。
1、假设生产者线程向数据存储空间添加了资源的Husband,还没有加入该资源的Wife,程序就切换到了消费者线程,消费者线程将把资源的Husband和上一个信息的Wife联系到一起。
2、生产者放入了若干次的数据,消费者才开始取数据,或者是,消费者取完一个数据后,还没等到生产者放入新的数据,又重复取出已取过的数据。
程序的基本实现:
/*线程间通讯:多个线程在处理同一资源,但是任务却不同。*///资源class Resource{private String husband;private String wife;public void setHusband(String husband){this.husband = husband;}public String getHusband(){return husband;}public void setWife(String wife){this.wife = wife;}public String getWife(){return wife;}}//生产class Producer implements Runnable{private boolean flag = true;private Resource r;public Producer (Resource r){this.r = r;}public void run(){while(true){if(flag){r.setHusband("郭靖");r.setWife("黄蓉");flag = false;}else{r.setHusband("董永");r.setWife("七仙女");flag = true;}}}}//消费class Consumer implements Runnable{private Resource r;public Consumer (Resource r){this.r = r;}public void run(){while(true){System.out.println(r.getHusband()+"----------------"+r.getWife());}}}public class ThreadCommunication{public static void main(String[] args){//创建资源。Resource r = new Resource();//创建任务。Producer p = new Producer (r);Consumer c = new Consumer (r);//创建线程,执行路径。Thread t1 = new Thread(p);Thread t2 = new Thread(c);//开启线程t1.start();t2.start();}}
问题解决一:加入同步代码块:
class Resource{private String husband;private String wife;public synchronized void set(String husband,String wife){this.husband = husband;this.wife = wife;}public synchronized Void get(){System.out.println(husband+"----------------"+wife);}}//生产class Producer implements Runnable{private boolean flag = true;private Resource r;public Producer (Resource r){this.r = r;}public void run(){while(true){if(flag){r.set("郭靖","黄蓉");flag = false;}else{r.set("董永","七仙女");flag = true;}}}}//消费class Consumer implements Runnable{private Resource r;public Consumer (Resource r){this.r = r;}public void run(){while(true){r.get();}}}public class ThreadCommunication2{public static void main(String[] args){//创建资源。Resource r = new Resource();//创建任务。Producer p = new Producer (r);Consumer c = new Consumer (r);//创建线程,执行路径。Thread t1 = new Thread(p);Thread t2 = new Thread(c);//开启线程t1.start();t2.start();}}
从程序的运行结果中可以发现,信息错乱的问题已经解决了,但是依然存在重复读取的问题,既然有重复读取,则肯定会有重复设置的问题,那么对于这样的问题该如何解决呢?
此时,就需要使用 Object类中的方法了(wait、notify、notifyAll)
0 0
- Java多线程㈣—①线程间通讯(生产者及消费者)
- 线程间通讯-----生产者与消费者(多线程)
- java基础—线程间的通讯 生产者与消费者
- 多线程 :消费者生产者 --线程通讯例子
- 线程间通讯----生产者消费者(单线程)
- Java多线程:生产者及消费者
- 线程间通讯------生产者与消费者(JDK升级版)
- java多线程(2):线程通信之生产者消费者模式及等待唤醒机制
- JAVA线程间通信(生产者消费者)
- 多线程 生产者消费者模式 线程之间的通讯问题
- java多线程-线程间通信_生产者消费者
- JAVA多线程-线程间通信(二)-生产者/消费者模式实现
- Java多线程编程3--线程间通信--生产者/消费者模式
- Java多线程之线程间通信--生产者/消费者模式
- java多线程线程通信——生产者和消费者
- C#的多线程机制探索(三)—线程的同步和通讯(生产者和消费者)
- java线程(生产者/消费者)
- JAVA多线程(三)生产者消费者模式及实现方法
- asponse.word按模板导出word文档
- can't start mysqld on centos because I cant find mysql.sock
- Remote System Explorer Operation总是运行后台服务,卡死eclipse解决办法
- Linux查看系统cpu个数、核心数、线程数
- latch: shared pool latch: library cache 诊断脚本(latchprofx.sql,latchprof.sql)
- Java多线程㈣—①线程间通讯(生产者及消费者)
- coco2dx绘制到纹理
- JavaScript中__proto__与prototype的关系
- 告别网贷系统圈钱模式,开启P2P网贷系统免费时代
- 网页中插入视频
- Android 基础动画总结
- MFC 对话框Dialog响应键盘事件(组合键Ctrl+A)
- iOS 企业证书发布app 流程
- Rings'n'Ropes - UVa 10985 Floyd