生产者消费者问题

来源:互联网 发布:实时直播软件下载 编辑:程序博客网 时间:2024/06/05 08:41
package com.wjx.sayHello;/* * 生产者和消费者问题 * 1.首先如果是异步处理,即不加synchronized会出现数据不安全处理,出现null值奇数偶数出现错误 * 2.同步处理之后,可能会出现数据重复的问题 * 3.接着就需要对数据进行设置等待wait()和唤醒notify()操作,当数据生成时候不予许取走,当消费没结束不允许生产 */class ProvideData implements Runnable{private Data data;public ProvideData(Data data){this.data=data;}@Overridepublic void run() {for(int x=0;x<10;x++){if(x%2==0){ this.data.set("是偶数", "我喜欢偶数");  }else{this.data.set("是基数","我不喜欢奇数");}}}}class ConsumeData implements Runnable{private Data data;public ConsumeData(Data data){this.data=data;}@Overridepublic void run() {for(int x=0;x<10;x++){this.data.get();}}}class Data{private String title;private String name;private boolean flag=false;//定义一个flag,falg=true表示允许生成,不予许取走.flag=false表示生成完毕,允许取走,但是不能够生成public synchronized void set(String title,String name){if(this.flag==true){try {super.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}this.title=title;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.name=name;this.flag=true;super.notify();}public synchronized void get(){if(this.flag==false){try {super.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(this.title+"=="+this.name);this.flag=false;super.notify();}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getName() {return name;}public void setName(String name) {this.name = name;}}public class TestDemo {public static void main(String[] args){Data data =new Data();new Thread(new ProvideData(data)).start();new Thread(new ConsumeData(data)).start();}}

原创粉丝点击