1.创建Queue.java
public class Queue {
private LinkedList list = new LinkedList() ;
private final int minSize = 0 ; ;
private final int maxSize ;
private AtomicInteger count = new AtomicInteger(0) ;
public Queue(int size){
this.maxSize = size ;
}
private final Object lock = new Object() ;
public void put(Object o){
synchronized(lock){
while(size() == this.maxSize){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(o) ;
//计数器增加
count.incrementAndGet() ;
//通知唤醒
lock.notify();
}
}
private int size(){
return count.get() ;
}
public Object take(){
Object res = null ;
synchronized(lock){
while(size() == this.minSize){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
res = list.removeFirst();
//计数器减1
count.decrementAndGet() ;
lock.notify();
}
return res ;
}
public static void main(String[] args) {
final Queue mq = new Queue(3) ;
mq.put("a");
mq.put("b");
mq.put("c");
new Thread(new Runnable() {
@Override
public void run() {
mq.put("g");
System.out.println("put1 secceseful");
mq.put("f");
System.out.println("put2 secceseful");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("take value = "+mq.take() );
}
}).start();
}
}
运行结果如下:
take value = a
put1 secceseful
执行第一个put的时候由于队列容量已经满了,所以线程阻塞。另一个线程take之后,阻塞的线程继续执行put成功。