Condition的功能类似在传统线程技术中的Object.wait和Object.notity的功能。
 
例子:生产者与消费者

 import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 有时候线程取得lock后需要在一定条件下才能做某些工作,比如说经典的Producer和Consumer问题。 在Java
* 5.0以前,这种功能是由Object类的wait(), notify()和notifyAll()等方法实现的,
* 在5.0里面,这些功能集中到了Condition这个接口来实现。
*/
public class ConditionTest { /**
* 篮子程序。Consumer必须在篮子里有苹果的时候才能吃苹果,否则它必须暂时放弃对篮子的锁定,
* 等到Producer往篮子里放了苹果后再去拿来吃。而Producer必须等到篮子空了才能往里放苹果,
* 否则它也需要暂时解锁等Consumer把苹果吃了才能往篮子里放苹果。
*/
public static class Basket {
// 锁
Lock lock = new ReentrantLock();
// 根据锁产生Condition对象
Condition produced = lock .newCondition();
Condition consumed = lock .newCondition();
// 篮子中的苹果数
int num = 0;
// 篮子中的最多放的苹果数
int count = 5; /**
* 生产苹果,往篮子里放
*
* @throws InterruptedException
*/
public void produce() throws InterruptedException {
// 获得锁
lock.lock();
System. out.println("Producer get a lock..." );
try {
// 判断是否满足生产条件
while (num == count) {
// 如果有苹果,则不生产,放弃锁,进入睡眠
// 等待消费者消费
System. out.println("Producer sleep..." );
consumed.await();
System. out.println("Producer awaked..." );
}
/* 生产苹果 */
Thread. sleep(new Random().nextInt(50));
System. out.println("Producer produced an Apple." );
num++;
System. out.println("Producer 篮子里有" + num + "个苹果" );
// 通知等待produced Condition的线程
produced.signal();
} finally {
lock.unlock();
}
} /**
* 消费苹果,从篮子中取
*
* @throws InterruptedException
*/
public void consume() throws InterruptedException {
// 获得锁
lock.lock();
System. out.println("Consumer get a lock..." );
try {
// 判断是否满足消费条件
while (num == 0) {
// 如果没有苹果,无法消费,则放弃锁,进入睡眠
// 等待生产者生产苹果
System. out.println("Consumer sleep..." );
produced.await();
System. out.println("Consumer awaked..." );
}
/* 吃苹果 */
Thread. sleep(new Random().nextInt(500));
System. out.println("Consumer consumed an Apple." );
num--;
System. out.println("Consumer 篮子里剩" + num + "个苹果" );
// 发信号唤醒某个等待consumed Condition的线程
consumed.signal();
} finally {
lock.unlock();
}
}
} /**
* 测试Basket程序
*/
public static void testBasket() throws Exception {
final Basket basket = new Basket();
// 定义一个producer
Runnable producer = new Runnable() {
public void run() {
try {
basket.produce();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}; // 定义一个consumer
Runnable consumer = new Runnable() {
public void run() {
try {
basket.consume();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}; // 各产生10个consumer和producer
ExecutorService service = Executors. newCachedThreadPool();
for (int i = 0; i < 10; i++) {
service.execute(producer);
}
for (int i = 0; i < 10; i++) {
service.execute(consumer);
}
service.shutdown();
} public static void main(String[] args) throws Exception {
ConditionTest. testBasket();
}
}

条件阻塞Condition的应用的更多相关文章

  1. 并发库应用之六 & 有条件阻塞Condition应用

    Condition的功能类似在传统线程技术中的 Object.wait() 和 Object.natify() 的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干 ...

  2. python线程条件变量Condition(31)

    对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...

  3. 竞态条件 race condition data race

    竞态条件 race condition Race condition - Wikipedia https://en.wikipedia.org/wiki/Race_condition A race c ...

  4. [development][C] 条件变量(condition variables)的应用场景是什么

    产生这个问题的起因是这样的: ‎[:] ‎<‎tong‎>‎ lilydjwg: 主线程要启动N个子线程, 一个局部变量作为把同样的参数传入每一个子线程. 子线程在开始的十行会处理完参数. ...

  5. j.u.c系列(06)---之锁条件:Condition

    写在前面 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5后,Java提供了Lock接 ...

  6. Linux组件封装(二)中条件变量Condition的封装

    条件变量主要用于实现线程之间的协作关系. pthread_cond_t常用的操作有: int pthread_cond_init(pthread_cond_t *cond, pthread_conda ...

  7. python线程的条件变量Condition的用法实例

      Condition 对象就是条件变量,它总是与某种锁相关联,可以是外部传入的锁或是系统默认创建的锁.当几个条件变量共享一个锁时,你就应该自己传入一个锁.这个锁不需要你操心,Condition 类会 ...

  8. threading 官方 线程对象和锁对象以及条件对象condition

    官方地址:https://docs.python.org/2/library/threading.html#thread-objects 以下只截取condition部分,其他Lock()以及thre ...

  9. [转] 条件变量(Condition Variable)详解

    http://www.wuzesheng.com/?p=1668 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A ...

随机推荐

  1. oracle ref游标

    Oracle 系列:REF Cursor 在上文  Oracle 系列:Cursor  (参见:http://blog.csdn.net/qfs_v/archive/2008/05/06/240479 ...

  2. 深入浅出JavaScript函数 v 0.5

    本文的观点是建立在<JavaScript权威指南 6th Ed> <JavaScript高级编程 3th Ed> <JavaScript精粹 2th Ed>之上, ...

  3. 【原创】lua的module的一些点

    lua的module好像是5.1开始有的 在xx.lua的开头写上 module('my_module') 这行等价于如下几行 local name = 'my_module' local M = { ...

  4. Mongodb集群部署ReplicaSet+Sharding -摘自网络

    网上关于三种集群方式的搭建方式很多,都是分开来介绍的.Replica Set (复制集成)主要是做主从库的,但是没法实现负载均衡的效果,真正实现这个的,是Sharding(分片集群),通过数据分布在每 ...

  5. elecworks 图框管理器

    图框管理器中存储的是图纸模板(图框),新建图框的步骤如下: 1 数据库---图框管理器----新建 2 打开图框属性设置窗口,设置图框属性,设置好之后点击确定 3 右击图框图标---打开(进入图框绘制 ...

  6. android最快的模拟器

    https://www.genymotion.com/ genymotion Genymotion是一套完整的工具,它提供了Android虚拟环境.它简直就是开发者.测试人员.推销者甚至是游戏玩家的福 ...

  7. PowerDesigner 企业架构模型 ( EAM )

    PowerDesigner 企业架构模型 ( EAM ) 说明 file工作数据库框架application网络   目录(?)[+]   一. 企业架构模型 说明 EnterpriseArchite ...

  8. c++中类长度解析

    通常我们定义一个类,它所占的空间有多大呢? 首先我们看一下下面的这个类 class A{ public: void func1(void){ printf("11111heihei\n&qu ...

  9. IDF实验室-简单编程-特殊的日子 writeup

    题目:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=50 题目提示要爆破,代表加密应该是不可逆的. 密文:4D ...

  10. sqlite3使用教程1 SQLite 命令

    http://www.runoob.com/sqlite/sqlite-commands.html 本章将向您讲解 SQLite 编程人员所使用的简单却有用的命令.这些命令被称为 SQLite 的点命 ...