先上代码
ValueObject 代码
package com.thread.P_C;
public class ValueObject {
public static String value="";
}
生产者代码
package com.thread.P_C;
public class P {
private String lock;
public P(String lock) {
super();
this.lock = lock;
}
public void setValue() {
try {
synchronized (lock) {
if (!ValueObject.value.equals("")) {
lock.wait();
}
String value = System.currentTimeMillis() + "_" + System.nanoTime();
System.out.println("set的值是" + value);
ValueObject.value = value;
lock.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
消费者代码
package com.thread.P_C;
public class C {
private String lock;
public C(String lock) {
super();
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();
}
}
}
主线程代码
package com.thread.P_C;
public class mainThread {
public static void main(String[] args) {
String lock = "";
P p = new P(lock);
C c = new C(lock);
ThreadP pThread = new ThreadP(p);
ThreadC cThread = new ThreadC(c);
pThread.start();
cThread.start();
}
}
class ThreadP extends Thread {
private P p;
public ThreadP(P p) {
super();
this.p = p;
}
public void run(){
while(true){
p.setValue();
}
}
}
class ThreadC extends Thread {
private C c;
public ThreadC(C c) {
super();
this.c = c;
}
public void run(){
while(true){
c.getValue();
}
}
}
运行结果
代码解析
生产者解析
主线程中启动生产者和消费者线程,当生产者线程和消费者执行开始。一开始 ValueObject 对象的值为空,则不进入if判断条件中。
接下来对 ValueObject.value 赋值,并调用 notify() 方法,notify() 方法,唤醒已经等待的消费者线程。
消费者解析
主线程中启动生产者和消费者线程,当生产者线程和消费者执行开始。
一开始 ValueObject 对象的值为空,则进入 if 判定条件中,调用wait() 方法,锁对象抛出,线程等待。
直到生产者线程调用 notify() 方法。唤醒消费这线程。唤醒消费者线程后,线程继续向下执行。
直到执行 notify() 唤醒生产者线程。
由上所述,连个线程交替执行。