• 多线程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
    	 */
    	
    }
    

      

  • 相关阅读:
    结构体中的冒号_转
    随机数产生random
    gdb调试段错误及使用
    gcc选项-g与-rdynamic的异同_转
    linux设备模型_转
    boost 1.57.0安装
    技术的正宗与野路子_转
    (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)
    (转)面试大总结之一:Java搞定面试中的链表题目
    (转)类加载器与双亲委派模型
  • 原文地址:https://www.cnblogs.com/bravolove/p/7944718.html
Copyright © 2020-2023  润新知