package thread.lock_condition;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyBlocingQueue<E> {
private final List<E> list;
private final int limit;
private final Lock lock = new ReentrantLock();
private final Condition notEmpty = lock.newCondition();//非空
private final Condition notFull = lock.newCondition();//没满
public MyBlocingQueue(int limit){
this.limit = limit;
this.list = new ArrayList<E>();
}
public void put(E e){
try {
lock.lock();
while(list.size() >= limit){
notFull.await();
}
list.add(e);
notEmpty.notifyAll();
} catch (Exception e2) {
// TODO: handle exception
}finally{
lock.unlock();
}
}
public E take(){
try {
lock.lock();
while(list.size() == 0){
notEmpty.await();
}
E e = list.remove(0);
notFull.notifyAll();
return e;
} catch (Exception e2) {
return null;
}finally{
lock.unlock();
}
}
}
用Lock Condition自主实现阻塞队列
最新推荐文章于 2024-06-21 16:50:51 发布