先上代码
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() 唤醒生产者线程。
由上所述,连个线程交替执行。
529

被折叠的 条评论
为什么被折叠?



