zoukankan      html  css  js  c++  java
  • 用Lock 和Newcondition实现同步容器 java

    package interview;
    
    import java.util.LinkedList;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    
    
    
    /*
     * 写一个固定容量同步容器,拥有put和get方法,以及getCount方法
     * 
     * 使用Lock和Condition来实现
     * 对比两种方式,Condition的方式可以更加精确的指定哪些线程被唤醒
     */
    
    public class ProducerConsumer<T> {
    	
    
    	final private LinkedList<T> list = new LinkedList<>();
    	final private int MAX=10;
    	private int count=0;
    	private Lock lock = new ReentrantLock();
    	private Condition producer = lock.newCondition();
    	private Condition consumer = lock.newCondition();
    	
    	
    	public void put(T t) {
    		lock.lock();
    		try {
    			while(list.size()==MAX) {
    				producer.await();
    			}
    			list.add(t);
    			++count;
    			consumer.signalAll();
    		}catch(Exception e) {
    			
    		}finally {
    			lock.unlock();
    		}
    	}
    	public T get() {
    		T t=null;
    		lock.lock();
    		try {
    			while(list.size()==0) {
    				consumer.await();
    			}
    			t = list.removeFirst();
    			count--;
    			producer.signalAll();
    		}catch(Exception e) {
    			
    		}finally {
    			lock.unlock();
    		}
    		return t;
    	}
    	
        public static void main(String[] args) {
    		ProducerConsumer<String> pc = new ProducerConsumer<>();
    		
    		//消费者线程
    		for(int i=0;i<10;i++) {
    			new Thread(() -> {
    				for(int j=0;j<5;j++) {
    					System.out.println(pc.get());
    				}
    			},"c"+i).start(); 
    		}
    		try {
    			TimeUnit.SECONDS.sleep(2);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		
    		//生产者线程
    		for(int i=0; i<2;i++) {
    			new Thread(() -> {
    				for(int j=0;j<25;j++) {
    					pc.put(Thread.currentThread().getName()+" "+j);
    				}
    			},"p"+i).start();
    		}
    		
    	}
    }
    
  • 相关阅读:
    Python-发送邮件
    Python基础-类的继承
    Python基础-列表推导式
    三、Linux下mysql的完整安装
    二、linux下apache2.2.11+php5.6.3的环境配置
    linux下编译安装php各种报错大集合
    一、linux下nginx1.7.8+php5.6.3的环境配置
    linux ./configure 的参数详解
    div随窗口变化设置高度
    在地图上增加标注点并为每个点增加各自的信息窗口
  • 原文地址:https://www.cnblogs.com/QAZLIU/p/9382102.html
Copyright © 2011-2022 走看看