packagecom.java.juc;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classTestProductAndConsumer {public static voidmain(String[] args) {
Clerk clerk= newClerk();
Produce produce= newProduce(clerk);
Consumer consumer= newConsumer(clerk);new Thread(produce, "线程A").start();new Thread(consumer, "线程B").start();new Thread(produce, "线程AA").start();new Thread(consumer, "线程BB").start();
}
}//店员
classClerk {private int product = 0;private Lock lock = newReentrantLock();private Condition condition =lock.newCondition();public voidget() {
lock.lock();try{while (product >= 1) { //这里使用while 不使用if 防止虚假唤醒
System.out.println("产品已满!");try{
condition.await();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+ " : " + ++product);
condition.signalAll();
}finally{
lock.unlock();
}
}public voidsale() {
lock.lock();try{while (product <= 0) {
System.out.println("缺货!");try{
condition.await();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+ " : " + --product);
condition.signal();
}finally{
lock.unlock();
}
}
}//生产者
class Produce implementsRunnable {privateClerk clerk;publicProduce(Clerk clerk) {this.clerk =clerk;
}
@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {try{
Thread.sleep(200);
}catch(InterruptedException e) {
e.printStackTrace();
}
clerk.get();
}
}
}//消费者
class Consumer implementsRunnable {privateClerk clerk;publicConsumer(Clerk clerk) {this.clerk =clerk;
}
@Overridepublic voidrun() {for (int i = 0; i < 20; i++) {
clerk.sale();
}
}
}