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
    	 */
    	
    }
    

      

  • 相关阅读:
    调用百度地图API添加点聚合时,marker标注的label标签刷新丢失问题
    redis--基本命令
    centos8安装redis6.0.5
    centos8更改镜像源
    centos8重启网络服务
    搭建eureka高可用
    html5图片缩放后上传blob
    mysql主从复制
    zTree
    datetimepicker使用总结
  • 原文地址:https://www.cnblogs.com/bravolove/p/7944718.html
Copyright © 2011-2022 走看看