原文: link.
阻塞队列
package blockqueue;
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 MyBlockQueue {
private volatile int size,capcity;
private List<Integer> container = new ArrayList<>();
private Lock lock = new ReentrantLock();
private final Condition isNull = lock.newCondition();
private final Condition isFull = lock.newCondition();
public MyBlockQueue(int capcity){
this.capcity = capcity;
}
public void add(int data){
try {
lock.lock();
try {
while (size >= capcity) {
System.out.println("队列已满");
isFull.await();
}
}catch (InterruptedException e) {
isFull.signal(); //?
e.printStackTrace();
}
++size;
container.add(data);
isNull.signal();
}finally {
lock.unlock();
}
}
public int take(){
try {
lock.lock();
try {
while (size == 0) {
System.out.println("队列已空");
isNull.await();
}
}catch (InterruptedException e) {
isNull.signal();
e.printStackTrace();
}
size--;
int res = container.get(0);
container.remove(0);
isFull.signal();
return res;
}finally {
lock.unlock();
}
}
}
测试
package blockqueue;
public class testMyBlockQueue {
public static void main(String[] args) {
MyBlockQueue queue = new MyBlockQueue(5);
Thread t1 = new Thread(() -> {
for(int i = 0; i < 100; i++){
queue.add(i);
System.out.println("塞入" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(() -> {
for(; ; ){
System.out.println("消费" + queue.take());
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}