并发编程-Condition
Condition
一个Lock中应该绑定一个Condition对象。Condition是Java提供用来实现等待/通知的类。
我们知道Object对象提供了wait、waitAll、notify、notifyAll的方法用来实现线程的同步、等待和唤醒。
但Condition类提供了比wait/notify更丰富的功能,Condition对象由lock对象所创建的,同时一个Lock可以创建多个Condition对象,即创建多个对象监听器,这样就可以指定唤醒具体线程,而notify是随机唤醒线程。
Condition接口
- void await():造成当前线程在接到信号或被中断之前一直处于等待状态。
- boolean await(long time, TimeUnit unit):造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
- long awaitNanos(long nanosTimeout):造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
- void awaitUninterruptibly():造成当前线程在接到信号之前一直处于等待状态。
- boolean awaitUntil(Date deadline):造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。
- void signal():唤醒一个等待线程。
范例
public class Resource {
private final int MAX_SIZE = 10;
private List<Object> list = Lists.newArrayList();
private Lock lock = new ReentrantLock();
private Condition produceCondition = lock.newCondition();
private Condition consumerCondition = lock.newCondition();
public void produce() {
while (true) {
lock.lock();
try {
while (list.size() == MAX_SIZE) {
System.out.println("生产满了,暂时无法生产:" + list.size());
consumerCondition.signal();
try {
produceCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(new Object());
System.out.println(Thread.currentThread().getName() + "生产新产品,共有:" + list.size());
} finally {
lock.unlock();
}
}
}
public void consume() {
while (true) {
lock.lock();
try {
while (CollectionUtils.isEmpty(list)) {
System.out.println("没有物品了,需要生产了");
produceCondition.signal();
try {
consumerCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "消费产品,共有:" + list.size());
list.remove(0);
} finally {
lock.unlock();
}
}
}
}
生产者线程
public class ProduceThread implements Runnable {
private Resource resource;
public ProduceThread(Resource resource){
this.resource = resource;
}
@Override
public void run() {
resource.produce();
}
}
消费者线程
public class ConsumerThread implements Runnable {
private Resource resource;
public ConsumerThread(Resource resource){
this.resource = resource;
}
@Override
public void run() {
resource.consume();
}
}
测试案例
public class ConditionDemo {
public static void main(String[] args) throws InterruptedException {
Resource resource = new Resource();
ProduceThread produceThread = new ProduceThread(resource);
ConsumerThread consumerThread = new ConsumerThread(resource);
// 4个生产者
for (int i = 0; i < 4; i++) {
new Thread(produceThread).start();
new Thread(consumerThread).start();
}
}
}
并发编程-Condition的更多相关文章
- JAVA并发编程--Condition
Condition主要是为了在J.U.C框架中提供和Java传统的监视器风格的wait,notify和notifyAll方法类似的功能. AQS等待队列与Condition队列是两个相互独立的队列 a ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- 并发编程实践三:Condition
Condition实例始终被绑定到一个锁(Lock)上.Lock替代了Java的synchronized方法,而Condition则替代了Object的监视器方法,包含wait.notify和noti ...
- java并发编程——通过ReentrantLock,Condition实现银行存取款
java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价. Lock 接口 ...
- 并发编程(六)——AbstractQueuedSynchronizer 之 Condition 源码分析
我们接着上一篇文章继续,本文讲讲解ReentrantLock 公平锁和非公平锁的区别,深入分析 AbstractQueuedSynchronizer 中的 ConditionObject 公平锁和非公 ...
- Java并发编程原理与实战二十二:Condition的使用
Condition的使用 Condition用于实现条件锁,可以唤醒指定的阻塞线程.下面来实现一个多线程顺序打印a,b,c的例子. 先来看用wait和notify的实现: public class D ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- 006 Java并发编程wait、notify、notifyAll和Condition
原文https://www.cnblogs.com/dolphin0520/p/3920385.html#4182690 Java并发编程:线程间协作的两种方式:wait.notify.notifyA ...
- 二十三、并发编程之深入解析Condition源码
二十三.并发编程之深入解析Condition源码 一.Condition简介 1.Object的wait和notify/notifyAll方法与Condition区别 任何一个java对象都继承于 ...
随机推荐
- 老Python总结的字典相关知识
字典 Python中的字典(dict)也被称为映射(mapping)或者散列(hash),是支持Python底层实现的重要数据结构. 同时,也是应用最为广泛的数据结构,内部采用hash存储,存储方式为 ...
- hdu 1298 字典树 + DFS (模拟T9文本输入)
题意: 给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...
- DVWA之 SQL Injection(Blind)
SQL Injection(Blind) SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法 ...
- Open VAS 漏扫工具的安装
wget -q -O - http://www.atomicorp.com/installers/atomic |sh .安装openvas [root@localhost ~]#yum -y ins ...
- 一个不错的过TP思路,转载CSDN
也许大家也是研究腾讯游戏的爱好者,对腾讯的游戏都有过这样的体会 例如OD与CE无法进行如以下操作: 无法附加进程, 无法打开进程, 游戏进程被隐藏无法在工具中查看到,内存无法读取代码 内存修改后游 ...
- android Javah生成JNI头文件
项目要用到c语言库,因此来学习下jni 首先是在cmd中使用javah,出现了javah不是内部或外部命令的错误提示,javah是jdk自带的工具,提示说明在系统环境变量中没有jdk的路径,或者配置错 ...
- idea中注释变成繁体字
原因:idea中快捷键与输入法快捷键冲突:crtl+shift+f 解决方法:修改输入法的简繁切换快捷键的设置,crtl+shift+f切换回简体输入方式 注意:如果调出全局搜索用crtl+shift ...
- zTree增加树形菜单格式
result为json字符串 //展示树形菜单 function showMenuTree(result) { console.log("页面展示函数:"+result); //属 ...
- mongo中常用的命令
命令使用mongo shell 执行 1.mongo中增加新字段 mongo shell 进入后执行use table选中要添加字段的库 db.getCollection('表名').update({ ...
- win10 下安卓源码同步小技巧
win10下,通过 清华镜像源 AOSP 可以快速拿到 100G 的 .repo 备份 然后 用 repo sync 就可以得到 安卓源码,爽不爽! 下载到win10 e盘下,用powershell ...