zoukankan      html  css  js  c++  java
  • 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成功。

  • 相关阅读:
    unnitest简单场景应用
    接口基础之request
    docker常用命令
    管理之心理学
    管理团队挑战和提升
    如何留下核心成员
    管理之面试技巧
    复杂接口请求怎样写http请求
    gitlab使用(一)
    不使用AutoLayout快速兼容适配iPhone6/6 Plus
  • 原文地址:https://www.cnblogs.com/dquery/p/6395553.html
Copyright © 2011-2022 走看看