package com.roocon.thread.ta7;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Tmall2 {
private int count;
private Lock lock = new ReentrantLock();
Condition p = lock.newCondition();
Condition t = lock.newCondition();
public final int MAX_COUNT = 10;
public void push() {
lock.lock();
while (count >= MAX_COUNT) {
try {
System.out.println(Thread.currentThread().getName() + " 库存数量达到上限,生产者停止生产。");
p.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println(Thread.currentThread().getName() + " 生产者生产,当前库存为:" + count);
t.signal();
lock.unlock();
}
public void take() {
lock.lock();
while (count <= 0) {
try {
System.out.println(Thread.currentThread().getName() + " 库存数量为零,消费者等待。");
t.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
System.out.println(Thread.currentThread().getName() + " 消费者消费,当前库存为:" + count);
p.signal();
lock.unlock();
}
}
改进下生产者和消费者。很简单。
--------------------------------------------------------------------------------------------------------------------------------------
实现有界的队列:入队满了需要等待,出队列的话为空需要等待。
package thread.tb1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyQueue<E> {
private Object[] obj;
private int addIndex;//添加的角标
private int removeIndex;//删除的脚标
private int queueSize;//队列的长度
private Lock lock = new ReentrantLock();
Condition addCondition = lock.newCondition();
Condition removeCondition = lock.newCondition();
public MyQueue(int count) {
obj = new Object[count];
}
public void add(E e){
lock.lock();
while (queueSize == obj.length) {
try {
addCondition.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
obj[addIndex] = e;
if (++addIndex == obj.length) {
addIndex = 0;
}
queueSize++;
removeCondition.signal();
lock.unlock();
}
public void remove(){
lock.lock();
while (queueSize == 0) {
try {
removeCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj[removeIndex] = null;
if (++removeIndex == obj.length) {
removeIndex = 0;
}
queueSize--;
addCondition.signal();
lock.unlock();
}
}