生产者和消费者基于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是交替运行的