Condition实现阻塞序列1

原创 2012年03月25日 15:48:46
作为一个示例,假定有一个绑定的缓冲区,它支持 put 和 take 方法。如果试图在空的缓冲区上执行 take 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 put 操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待 set 中保存 put 线程和 take 线程,这样就可以在缓冲区中的项或空间变得可用时利用最佳规划,一次只通知一个线程。可以使用两个 Condition 实例来做到这一点。 

 class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length) 
         notFull.await();
       items[putptr] = x; 
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0) 
         notEmpty.await();
       Object x = items[takeptr]; 
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   } 
 }

相关文章推荐

java5条件阻塞condition的应用(1)

关于互斥锁synchronize和lock 假如存在主线程main和子线程sub,使用同一把lock锁,若主线程获取lock锁后执行方法,此时子线程若再去获取同一把lock锁,便会阻塞,直到主线程...

Java多线程与并发应用-(11)-用Lock+Condition实现1,2,3 三个模块按顺序执行。

package com.lipeng; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks....

Linux C++ 使用condition实现阻塞队列

/* * BlockingQueue.cpp * * Created on: 2014年6月10日 * Author: */ #include "../include/Bloc...

Lock和Condition实现线程通信(附阻塞队列的实例)

第一种情况:就使用单个Condition对象实现通信,方式同wait()和notify()   condition是await()和signal(),其中condition对象是通过lock.get...
  • com360
  • com360
  • 2011年09月21日 17:22
  • 3888

java实现缓冲区(阻塞队列,condition,lock)

package com.zx.test.thread; import java.util.concurrent.locks.Condition; import java.util.concurre...

聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个阻塞队列

第一次看到管程这个中文名称很
  • ITer_ZC
  • ITer_ZC
  • 2014年10月31日 11:34
  • 4602

Java多线程/并发21、利用Condition来实现阻塞队列

Java文档上的例子,利用Condition来实现阻塞队列。 假设有一个固定大小的缓冲区(缓冲区是队列,遵守FIFO),支持存和取方法。如果缓冲区为空时尝试取数据,那么线程将阻塞,直到缓冲区有一个可...
  • soonfly
  • soonfly
  • 2017年05月04日 20:56
  • 483

java 使用ReentrantLock Condition实现阻塞队列

阻塞队列简单实现。先进先出

数据结构与算法分析笔记与总结(java实现)--二叉树1:递归二叉树的序列打印练习题

数据结构与算法分析笔记与总结(java实现)--二叉树1:递归二叉树的序列打印练习题...

C#--第七周实验--任务5--编写一个控制台应用,实现输出一个从1开始到511*511长度的随机数序列

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. *...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Condition实现阻塞序列1
举报原因:
原因补充:

(最多只允许输入30个字)