java多线程实现简单队列

  1.创建Queue.java

public class Queue {
        
        private LinkedList<Object> list = new LinkedList<Object>() ;
        
        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成功。