/*
* 生产者消费者案例:
*/
public class TestProductorAndConsumerForLock {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Productor pro = new Productor(clerk);
Consumer con = new Consumer(clerk);
new Thread(pro, "生产者 A").start();
new Thread(con, "消费者 B").start();
}
}
class Clerk {
private int product = 0;
private Lock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();
// 进货
public void get() {
while(true){
lock.lock();
try {
if (product >= 10) { // 为了避免虚假唤醒,应该总是使用在循环中。
System.out.println("产品已满!");
try {
notFull.await();//生产者阻塞 让给消费者执行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " : 存货"
+ ++product);
notEmpty.signal();//唤醒消费者
} finally {
lock.unlock();
}
}
}
// 卖货
public void sale() {
while(true){
lock.lock();
try {
if (product <= 0) {
System.out.println("缺货!");
try {
notEmpty.await();//消费者阻塞 让给生产者执行
//替代this.wait;
} catch (InterruptedException e) {
}
}
System.out.println(Thread.currentThread().getName() + " :余货 "
+ --product);
notFull.signal();//唤醒 生产者
//代替this.notifyall();
} finally {
lock.unlock();
}
}
}
}
// 生产者
class Productor implements Runnable {
private Clerk clerk;
public Productor(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.get();
}
}
}
// 消费者
class Consumer implements Runnable {
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
clerk.sale();
}
}
}