参考等待唤醒机制中原始代码
package com.neutron.thread.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource {
private String resName;
private int count = 1;
private boolean flag = false;
/**
* 锁对象
*/
private Lock lock = new ReentrantLock();
/**
* 生产者线程处理对象,代理Object
*/
private Condition proCondition = lock.newCondition();
/**
* 消费者线程处理对象,代替Object
*/
private Condition conCondition = lock.newCondition();
public void set(String resName) {
lock.lock();
try {
while(flag) {
proCondition.await();
}
this.resName = "product [food:" + resName + count++ +"]";
System.out.println(this.resName);
this.flag = true;
conCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void get(){
lock.lock();
try {
while(!flag) {
conCondition.await();
}
System.out.println("consumer [deal: " + this.resName + "]");
this.flag = false;
proCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
package com.neutron.thread.juc;
/**
* 生产者
* @author zhanght
*
*/
public class Producter implements Runnable {
private Resource res;
public Producter(Resource res) {
this.res = res;
}
@Override
public void run() {
while(true) {
res.set("土豆");
}
}
}
package com.neutron.thread.juc;
public class Consumer implements Runnable {
private Resource res;
public Consumer(Resource res) {
this.res = res;
}
@Override
public void run() {
while (true) {
res.get();
}
}
}
package com.neutron.thread.juc;
public class ProCon {
public static void main(String[] args) {
Resource res = new Resource();
Producter pro1 = new Producter(res);
Producter pro2 = new Producter(res);
Consumer con1 = new Consumer(res);
Consumer con2 = new Consumer(res);
new Thread(pro1).start();
new Thread(pro2).start();
new Thread(con1).start();
new Thread(con2).start();
}
}