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();
    		}
    		
    	}
    }
    
  • 相关阅读:
    设计模式复习【1】- 设计原则
    Java8的学习笔记
    Gson关于抽象类的序列化与反序列化
    关于一个Java web与JFrame的深度结合
    《重构》笔记
    JAVA8 Stream API总结的好的文章 —— 持续更
    Spring Boot引入Thymeleaf前端框架的诸多问题
    敏捷开发:原则,模式与实践——第8章 单一职责原则SRP
    maven 你应该懂得那些事
    redis之单机和主从环境搭建
  • 原文地址:https://www.cnblogs.com/QAZLIU/p/9382102.html
Copyright © 2011-2022 走看看