zoukankan      html  css  js  c++  java
  • 多线程14---模拟消息队列

    1.

    /**
     * 模拟Queue
     * @author alienware
     *
     */
    public class MyQueue {
    	private final LinkedList<Object> list = new LinkedList<Object>();
    	private final AtomicInteger count = new AtomicInteger(0);
    	private final int maxSize;
    	private final int minSize = 0;
    	private final Object lock = new Object();
    	
    	public MyQueue (int maxSize){ //初始化队列
    		this.maxSize = maxSize;
    	}
    
    	public void put (Object obj) {
    		synchronized(lock){ //对象锁
    			while(count.get() == maxSize){
    				try {
    					lock.wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			list.add(obj);
    			count.getAndIncrement(); // count++
    			System.out.println(" 元素 " + obj + " 被添加 ");
    			lock.notify();
    		}
    	}
    	
    	public Object take(){
    		Object temp = null;
    		synchronized (lock) { //对象锁
    			while(count.get() == minSize){
    				try {
    					lock.wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			count.getAndDecrement();// count--
    			temp = list.removeFirst();
    			System.out.println(" 元素 " + temp + " 被消费 ");
    			lock.notify();
    		}
    		return temp;
    	}
    	
    	public int size(){
    		return count.get();
    	}
    	
    	public static void main(String[] args) throws Exception {
    		
    		final MyQueue m = new MyQueue(5);
    		m.put("a");
    		m.put("b");
    		m.put("c");
    		m.put("d");
    		m.put("e");
    		System.out.println("当前元素个数:" + m.size());
    		Thread t1 = new Thread(new Runnable() { //生产者
    			@Override
    			public void run() {
    				m.put("h");
    				m.put("i");
    			}
    		}, "t1");
    		
    		Thread t2 = new Thread(new Runnable() { // 消费者
    			@Override
    			public void run() {
    				try {
    					while(m.size() != 0){
    						System.out.println("被取走的元素:"+m.take());
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}, "t2");
    
    		t1.start();
    		Thread.sleep(1000);
    		t2.start();
    	}
    	/*
    	 *  元素 a 被添加 
    		 元素 b 被添加 
    		 元素 c 被添加 
    		 元素 d 被添加 
    		 元素 e 被添加 
    		当前元素个数:5
    		 元素 a 被消费 
    		 元素 h 被添加 
    		被取走的元素:a
    		 元素 b 被消费 
    		被取走的元素:b
    		 元素 i 被添加 
    		 元素 c 被消费 
    		被取走的元素:c
    		 元素 d 被消费 
    		被取走的元素:d
    		 元素 e 被消费 
    		被取走的元素:e
    		 元素 h 被消费 
    		被取走的元素:h
    		 元素 i 被消费 
    		被取走的元素:i
    	 */
    	
    }
    

      

  • 相关阅读:
    语句被终止。完成执行语句前已用完最大递归 100
    Sql日期时间格式转换(转)
    MVC 记录操作日志与过滤特殊字符
    掌握这些,自学效率嗖嗖的!
    正式开始聊聊自学那些事儿!
    《可执行的自学编程方法体系》前言-为什么我要分享自己的自学经验总结?
    系统化的学习才是有效的学习!
    知识学了就忘怎么办?
    “面试”是绝佳的学习方式!
    分水岭:知识的深度拓展
  • 原文地址:https://www.cnblogs.com/bravolove/p/7944718.html
Copyright © 2011-2022 走看看