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成功。

  • 相关阅读:
    30款超酷的HTTP 404页面未找到错误设计
    java与java学习路线
    程序员最核心的竞争力
    群智能优化算法-测试函数matlab源码
    如何用Latex合并多个pdf文件?
    Latex--TikZ和PGF--高级文本绘图,思维绘图,想到--得到!
    学无止境 气有浩然
    Latex中定义、定理、引理、证明 设置方法总结
    WeUI
    微信JS SDK Demo 官方案例
  • 原文地址:https://www.cnblogs.com/dquery/p/6395553.html
Copyright © 2011-2022 走看看