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

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

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

/**
 * @author [email protected]
 * @date 2018-05-12 15:42
 */
public class ValueObject {
    public static String value = "";
}
/**
 * @author [email protected]
 * @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 [email protected]
 * @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 [email protected]
 * @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 [email protected]
 * @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 [email protected]
 * @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是交替运行的









猜你喜欢

转载自blog.csdn.net/heart66_a/article/details/80296716