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();
    		}
    		
    	}
    }
    
  • 相关阅读:
    记录「十一月做题记录」
    题解「GMOJ6898 【2020.11.27提高组模拟】第二题」
    题解「CFGYM102331B Bitwise Xor」
    题解「Japan Alumni Group Summer Camp 2018 Day 2J AB Sort」
    题解「AGC048B Bracket Score」
    题解「中位数之中位数 median」
    记录「十月做题记录」
    测试「2020牛客NOIP赛前集训营-提高组(第五场)」
    测试「20201028测试总结」
    定时提醒助手
  • 原文地址:https://www.cnblogs.com/QAZLIU/p/9382102.html
Copyright © 2011-2022 走看看