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