zoukankan      html  css  js  c++  java
  • 生产者消费者场景下用显式条件队列简单实现如果容器满存放阻塞等待,如果容器空取等待

    生产者消费者场景下用显式条件队列简单实现如果容器满存放阻塞等待,如果容器空取等待实现条件;

    取操作:当容器元素没多余时,读取操作挂起,释放CPU资源;阻塞

    存操作:当容器内的容量达到上限后,存操作挂起,释放CPU资源,阻塞

    import net.jcip.annotations.GuardedBy;
    
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ConditionDemo<T> {
    
    	Lock lock = new ReentrantLock();
    
    	//条件谓词 count<array.length
    	private Condition notFull = lock.newCondition();
    
    	//条件谓词 count>0
    	private Condition notEmpty = lock.newCondition();
    
    	private T[] items = (T[]) new Object[3];
    
    	@GuardedBy("lock")
    	private int tails, head, count;
    
    
    	public void put(T x) {
    		lock.lock();
    
    		try {
    
    			while (count == items.length) {
    				System.out.println("当前容器已满,没有足够空间存放更多元素,请先释放...");
    				notFull.await();
    			}
    			items[tails] = x;
    			if (++tails == items.length) {
    				tails = 0;
    			}
    			count++;
    			notEmpty.signal();
    
    		} catch (InterruptedException e) {
    			System.out.println(e.getMessage());
    
    		} finally {
    			lock.unlock();
    		}
    
    	}
    
    	public T take() {
    		lock.lock();
    
    		try {
    
    			while (count == 0) {
    				System.out.println("当期容器没有任何元素可供读取,请先存放元素到容器中...");
    				notEmpty.await();
    			}
    			T x = items[head];
    			items[head] = null;
    			if (++head == items.length) {
    				head = 0;
    			}
    			--count;
    			notFull.signal();
    			System.out.println("取出元素:" + x);
    			return x;
    
    		} catch (InterruptedException e) {
    			System.out.println(e.getMessage());
    
    		} finally {
    			lock.unlock();
    		}
    		return null;
    
    	}
    
    
    	public static void main(String[] args) {
    		ConditionDemo<String> conditionDemo = new ConditionDemo<>();
    		
    		new Thread(() -> {
    			conditionDemo.take();
    		}).start();
    
    		new Thread(() -> {
    			conditionDemo.put("hello");
    		}).start();
    
    	}
    }
    

      

  • 相关阅读:
    mysql慢查询日志功能的使用
    回顾JavsScript对象的克隆
    JavaScript的几种继承方式
    再谈JavaScript中的闭包
    重温JavaScript预编译的四个步骤
    PHP常用设计模式
    编译 php-memcache 扩展时提示Cannot find autoconf
    CentOS 7 下编译安装lnmp之PHP篇详解
    CentOS 7 下编译安装lnmp之MySQL篇详解
    MySQL的转义符 ` 作用
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/13062710.html
Copyright © 2011-2022 走看看