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. HDU4289 Control 最大流

    经典题,求去掉若干个点,使得两个点不在连通,总价值最少 所以拆点最小割,除了拆点边,流量都为无穷,拆点边是流量为价值 #include <iostream> #include <cs ...

  2. Codeforces 611D New Year and Ancient Prophecy dp+字符串比较

    这是CF Goodbye 2015 的D题,当时我想了一个n^3的dp算法,肯定不能过,然后听到学长后缀数组的n^2log(n)写法,仰慕 最后打完比赛看到了t神的n^2写法,简直膜拜,直接省去了后缀 ...

  3. Java + Excel 接口自动化

    最近项目比较悠闲,想找点事干,写了个 Excel 接口测试的 "框架" 以前用 python 写过一个,这次用 java, 应该说框架都不算,反正就是写了,能帮我解决问题就行. 当 ...

  4. 【原】实验室签到PHP版本

    表单 <html> <body> <h1>实验室自动签到测试</h1> <h2>输入学号和登录密码(建议自己改过密码后再来录入您的数据)&l ...

  5. puppet学习:文件夹权限的问题

    之前Zabbix自动部署的文件夹结构总觉得别扭,今天下午抽空调整了下.调整完后,依然是例行的测试. 在客户端执行puppet agent -t时,报错如下: Failed to generate ad ...

  6. 《UNIX环境高级编程 第2版》读书笔记

    CH1-2:基础知识.标准化 1 文件和目录 文件名:不能含/(分隔路径)和null(终止路径),255字符. 目录处理:opendir() readdir() closedir() 更改工作目录:c ...

  7. 基于Ubuntu 15.04 LTS编译Android5.1.0源代码 (转)

    原文链接:http://blog.csdn.net/yuxiangyunei/article/details/45365235   环境: ubuntu:ubuntu-15.04-desktop-am ...

  8. windows内核窥探

    windows是一个非常优秀的OS,从今天开始,我要和大家共同分享windows给我们带来的快乐!本人只所以将自己的学习笔记与大家分享,一是让自己更深入的理解windows,再就是有什么疏漏之处,望大 ...

  9. 【暑假】[深入动态规划]UVa 10618 Fun Game

    UVa 10618 Fun Game 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36035 思路:   一圈人围坐 ...

  10. ffmpeg常见命令

    一.安装       下载ffmpeg,解压之后配置环境变量即为安装 打开dos界面,进入目标文件夹例如:E:/ cd E:\BaiduYunDownload\ffmpeg\ffmpeg_simple ...