且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

java生产者消费者同步问题

更新时间:2022-05-01 22:13:42

public class TestThread {
    public static void main(String[] args) {
        Data data=new Data();
        new Thread(new DataProvider(data)).start();
        new Thread(new DataConsumer(data)).start();
    }
}

class Data{
    private String title;
    private String note;
    //flag=false表示生产完毕,允许消费者取走,但是不允许再生产。
    //flag=true表示允许生产,不允许消费者取走。
    private boolean flag=false;  
    public synchronized void get(){  
        if(flag==false){  //flag=false表示生产完毕,允许消费者取走,但是不允许再生产。
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(this.title+="="+this.note);
        this.flag=false; //表示已经生产过了,不允许再生产
        super.notify();  //唤醒等待线程
    }

    public synchronized void set(String title,String note){
        if(flag==true){  
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.title=title;
        try {
            Thread.sleep(15);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.note=note;
        this.flag=true;  //表示继续生产。
        super.notify();
    }
}
class DataProvider implements Runnable{
    private Data data;
    public DataProvider(Data data){
        this.data=data;
    }
    @Override
    public void run() {
        for(int x=0;x<50;x++){
            if(x%2==0){
                this.data.set("jk","666");
            }else{
                this.data.set("xx","555");
            }
        }
    }
}
class DataConsumer implements Runnable{
    private Data data;
    public DataConsumer(Data data){
        this.data=data;
    }
    @Override
    public void run() {
        for(int x=0;x<50;x++){
            this.data.get();
        }
    }
}