模拟Queue与BlockingQueue
BlockingQueue:顾名思义,他就是一个队列,并且支持阻塞的机制,阻塞的放入和得到数据。我们要实现LinkedBlockingQueue下面两个件简单的方法put和take.
Put(object):把object加入到BlockingQueue里面,如果BlockingQueue没有空间,则调用此方法的线程被阻塞,直到BlockingQueue里面有空间再继续。
Take:取走BlockingQueue里面排在首页的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据加入。
如下:
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class Test2{
// 需要一个承装元素的集合
private final LinkedList<Object> list = new LinkedList<Object>();
// 2 需要一个计数器
private AtomicInteger count = new AtomicInteger(0);
private final int minSize = 0;
private final int maxSize;
public Test2(int size) {
this.maxSize = size;
}
private final Object lock = new Object();
public void put(Object obj) throws Exception
{
synchronized (lock) {
while(count.get()==maxSize)
{
lock.wait();
}
list.add(obj);
count.incrementAndGet();
System.out.println("放入数据"+obj);
lock.notify();
}
}
public Object take() throws Exception
{
Object removeFirst = null;
synchronized (lock) {
while(count.get()==minSize)
{
synchronized (lock) {
lock.wait();
}
}
removeFirst = list.removeFirst();
count.decrementAndGet();
System.out.println("取出数据"+removeFirst);
lock.notify();
}
return removeFirst;
}
public static void main(String[] args) throws Exception {
Test2 test1 = new Test2(5);
test1.put("a");
test1.put("b");
test1.put("c");
test1.put("d");
test1.put("e");
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
test1.put("f");
test1.put("g");
} catch (Exception e) {
e.printStackTrace();
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
test1.take();
test1.take();
} catch (Exception e) {
e.printStackTrace();
}
}
},"t2");
t1.start();
TimeUnit.SECONDS.sleep(2);
t2.start();
}
}
运行的结果为:
放入数据a
放入数据b
放入数据c
放入数据d
放入数据e
取出数据a
取出数据b
放入数据f
放入数据g