java中生产者和消费者模式的实现

生产者和消费者基于wait/notify的

1.一生产与一消费:操作值

/**
 * @author xupenghao@163.com
 * @date 2018-05-12 15:42
 */
public class ValueObject {
    public static String value = "";
}
/**
 * @author xupenghao@163.com
 * @date 2018-05-12 15:37
 * @description 生产者
 */
public class P {
    private String lock;
    public P(String lock){
        this.lock = lock;
    }

    public void setValue(){
        try {
            synchronized(lock){
                if(!ValueObject.value.equals("")){
                    lock.wait();
                }
                String value = System.currentTimeMillis()+"_"+
                        System.currentTimeMillis();
                System.out.println("set 的值是 "+value);
                ValueObject.value = value;
                //通知消费者你可以取了
                lock.notify();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
/**
 * @author xupenghao@163.com
 * @date 2018-05-12 15:45
 * @description 消费者
 */
public class C {

    private String lock;
    public C(String lock){
        this.lock = lock;
    }
    public void getValue(){
        try {
            synchronized(lock){
                if(ValueObject.value.equals("")){
                    lock.wait();
                }
                System.out.println("get 的值是"+ValueObject.value);
                ValueObject.value = "";
                //告诉生成这我已经=取过了
                lock.notify();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
/**
 * @author xupenghao@163.com
 * @date 2018-05-12 15:52
 */
public class ThreadC extends Thread {

    private C c;
    public ThreadC(C c){
        this.c = c;
    }

    @Override
    public void run() {
        while(true){
            c.getValue();
        }
    }
}
/**
 * @author xupenghao@163.com
 * @date 2018-05-12 15:50
 */
public class ThreadP extends Thread {
    private P p;
    public ThreadP(P p){
        this.p = p;
    }

    @Override
    public void run() {
        while(true){
            p.setValue();
        }
    }
}
/**
 * @author xupenghao@163.com
 * @date 2018-05-12 15:57
 */
public class Test {
    public static void main(String[] args) {
        String lock = new String("");
        P p = new P(lock);
        C r = new C(lock);
        ThreadP threadP = new ThreadP(p);
        ThreadC threadC = new ThreadC(r);
        threadP.start();
        threadC.start();
    }
}

程序运行结果:


结果分析:本实例是一个生产者和一个消费者进行数据的交互,在控制台打印的日志get和set是交替运行的









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值