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;
}
@Override
public 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;
}
@Override
public 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 block
e.printStackTrace();
}
}
this.title=title;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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 block
e.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();
}
}
生产者消费者问题
最新推荐文章于 2023-10-03 00:39:13 发布