Java多线程㈣—①线程间通讯(生产者及消费者)
2015-02-12 16:19
483 查看
在线程操作中有一个经典的案例程序,即生产者和消费者问题,生产者不断生产,消费者不断取走生产者生产的产品。
假设:有两个线程,一个线程负责生产产品,一个线程负责消费产品。其中产品是两个线程处理的同一资源。由于线程的不确定性,所以会存在一下两点问题。
1、假设生产者线程向数据存储空间添加了资源的Husband,还没有加入该资源的Wife,程序就切换到了消费者线程,消费者线程将把资源的Husband和上一个信息的Wife联系到一起。
2、生产者放入了若干次的数据,消费者才开始取数据,或者是,消费者取完一个数据后,还没等到生产者放入新的数据,又重复取出已取过的数据。
程序的基本实现:
问题解决一:加入同步代码块:
从程序的运行结果中可以发现,信息错乱的问题已经解决了,但是依然存在重复读取的问题,既然有重复读取,则肯定会有重复设置的问题,那么对于这样的问题该如何解决呢?
此时,就需要使用 Object类中的方法了(wait、notify、notifyAll)
假设:有两个线程,一个线程负责生产产品,一个线程负责消费产品。其中产品是两个线程处理的同一资源。由于线程的不确定性,所以会存在一下两点问题。
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)
相关文章推荐
- java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
- 黑马程序员--JAVA基础复习之多线程(三)线程间通信 生产者消费者
- Java基础学习6_多线程(线程间通信--生产者消费者)
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- 【Java多线程】多线程之间实现通讯与生产者与消费者模式
- 多线程 :消费者生产者 --线程通讯例子
- JAVA多线程-生产者与消费者当线程多时发生死锁的解决方法
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- Java多线程之线程间通信--生产者/消费者模式
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- Java 多线程(二)线程间的通信应用--生产者消费者(未完)
- java基础—线程间的通讯 生产者与消费者
- Java基础之多线程(二)--通讯、生产者消费者、停止、Jion方法
- 从Java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换
- java 多线程,生产者消费者实现。适合多个生产者消费者线程;打印线程编号便于查看正确性
- Java基础学习__多线程(线程间通信--生产者消费者JDK5.0升级版)
- java多线程:线程间的通信-生产者和消费者(三)
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- java多线程-线程间通信_生产者消费者
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition