Java Condition条件对象
Condition用于管理已经获得了一个锁但是却不能做有用工作的线程。由Lock对象的newCondition()方法一个与当前Lock对象相关联的条件对象,共同管理该锁相关的对象和线程。
当线程已经获得锁,但是因为条件限制,无法继续工作的时候,调用Condition.await()方法,此线程进入该条件对象的等待集。当锁可用时,该线程不能马上解除阻塞。相反,它处于阻塞状态,直到另个线程调用同一条件上的signalAll方法时为止,这个方法可以激活所有等待的线程。Condition还有一个Signal方法,该方法是随机激活一个线程。
SignalAll不会立即激活一个等待线程,它仅仅解除等待线程的阻塞,以便这些线程可以在当前线程退出同步方法之后,通过竞争实现对对象的访问。
/**
* Created by LvJianwei on 2018/2/11.
*/ import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* @program: ConditionDemo
* @description:
* @author: LvJianwei
* @create: 2018-02-11 15:57
**/
public class ConditionDemo { public static void main(String[] args) {
ConditionDemo demo = new ConditionDemo();
Runnable rAdd = () -> {
while (true) {
try {
demo.countAdd();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}; Runnable rReduce = () -> {
while (true) {
try {
demo.countReduce();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
for (int i = 0; i < 5; i++) {
Thread t = new Thread(rReduce);
t.start();
}
for (int i = 0; i < 5; i++) {
Thread t = new Thread(rAdd);
t.start();
} } private Random random=new Random(System.currentTimeMillis());
private ReentrantLock locker = new ReentrantLock();
private Condition enough;
private int count = 0;
private int enoughCount=3; public ConditionDemo() {
enough = locker.newCondition();
} public void caculateWithLock() {
locker.lock();
try {
int randomResult=random.nextInt();
boolean shouldWait=randomResult%5==0;
System.out.printf("randomResult:%d%%5==0:%b,%s\n",randomResult,shouldWait,shouldWait?"await":"continue");
while(!shouldWait)
{
countAdd();
enough.await();
}
countReduce();
printLockStatus();
longTimeLock();
System.out.println("final count:" + count);
enough.signalAll(); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
locker.unlock();
}
} public void countAdd() {
locker.lock();
try {
count++;
System.out.printf("Add,count:%d\n", count);
if(count>enoughCount){
System.out.println("signAll");
enough.signalAll();
}
}
finally {
locker.unlock();
}
} public void countReduce() {
System.out.println("countReduce start,threadID:"+Thread.currentThread().getId());
locker.lock();
try {
while (count<enoughCount){
System.out.printf("threadID:%s,await,count:%d\n",Thread.currentThread().getId(),count);
enough.await();
}
count--;
System.out.printf("threadID:%s,reduce,count:%d\n",Thread.currentThread().getId(),count); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
locker.unlock();
}
} public void longTimeLock() {
locker.lock();
try {
printLockStatus();
int locktime = 3000;
System.out.printf("longTimeLock:%d ms\n", locktime);
Thread.sleep(locktime);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
locker.unlock();
}
} private void printLockStatus() {
System.out.printf("lock count:%d,queueLength:%d\n", locker.getHoldCount(), locker.getQueueLength());
}
}
add和reduce方法分别关联5个线程,对于reduce方法,只有当count>=enoughCount时才会进行减操作,否则就等待,由add方法,当count>enoughCount时,触发signalall方法。
下面运行结果可以看出,开始的13、11、12线程启动后,发现count<enoughCount,进入阻塞状态,直到add方法增加count到大于enoughCount时才执行减操作。
countReduce start,threadID:13
threadID:13,await,count:0
countReduce start,threadID:11
threadID:11,await,count:0
Add,count:1
Add,count:2
countReduce start,threadID:12
threadID:12,await,count:2
Add,count:3
Add,count:4
signAll
countReduce start,threadID:15
threadID:15,reduce,count:3
countReduce start,threadID:14
threadID:14,reduce,count:2
Java Condition条件对象的更多相关文章
- java Condition条件变量的通俗易懂解释、基本使用及注意点
最近在看pthread方面的书,看到条件变量一节的时候,回忆了下java中条件变量的使用方式. java中条件变量都实现了java.util.concurrent.locks.Condition接口, ...
- python多线程--Condition(条件对象)
Condition class threading.Condition(lock=None 这个类实现条件变量对象.条件变量允许一个或多个线程等待,知道它们被另一个线程唤醒. 如果给出了lock参数而 ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- Java多线程——Condition条件
简介 Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signa ...
- Java并发(十一):Condition条件
先做总结: 1.为什么使用Condition条件? synchronized配合Object的wait().notify()系列方法可以实现等待/通知模式. Lock提供了条件Condition,对线 ...
- java 多线程(三)条件对象
转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47417383 在上一篇博客中,我们学会了用ReentrantLock来控制线程訪问 ...
- Java并发包源码学习系列:详解Condition条件队列、signal和await
目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...
- threading 官方 线程对象和锁对象以及条件对象condition
官方地址:https://docs.python.org/2/library/threading.html#thread-objects 以下只截取condition部分,其他Lock()以及thre ...
- Java学习——面对对象的思想入门
本文是看过<head first Java>之后的一点感悟,写点东西帮忙以后回忆,Java目前在我的工作中用到还不多,而我又对面对对象的编程非常的感兴趣.曾经在MFC平台上写过 ...
- 锁对象-条件对象-synchronized关键字
1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import ja ...
随机推荐
- for循环的学习,内部有不懂得地方
# for循环介绍,他是一种可迭代的循环.暂时不知道什么是迭代: # 字符串是可迭代对象. """ 格式书写: for 循环: for 变量 in 可迭代的东西: 代码 ...
- 方便快捷的使用LiveQing生成可以集成到业务界面的播放代码-点播、直播、HLS、RTMP、HTTP-FLV
播放集成 配置需要的播放属性 生成分享页面和iframe集成页面 开始播放吧 WEB:www.liveqing.com
- 视频平台、NVR、摄像头通过GB28181接入实现WEB分屏播放以及大屏展示
青柿流媒体解决方案https://www.liveqing.com包含:LiveQing云平台直播点播流媒体服务,LiveGBS国标GB28181无插件流媒体服务,LiveNVR安防Onvif/RTS ...
- git 本地协议、http、ssh、git协议优缺点总结对比
之前一直使用的是git的http协议来推拉代码,新公司使用的是git协议,好奇这两种的区别,科普了一下,https://cloud.tencent.com/developer/article/1347 ...
- 有点意思!Java8后最有用新特性排行榜!
相信这两天看了 JDK 25 新特性的同学已经彻底对 Oracle 失望了,这那是挤牙膏啊?是连牙膏都懒得挤了. 所以,大家都在评论区喊话,如果你(Oracle)实在不想发可以不发,但不要糊弄大家. ...
- shell/Linux 任务学习笔记整理3:grep/ps/top
注: 原文链接:https://blog.csdn.net/yjclsx/article/details/81508455 原文链接:ps命令之排序 - 海东潮 - 博客园 (cnblogs.com) ...
- Mybatis如何动态生成插入的列及批量插入值
有时会遇到根据特定的情况动态创建表,并对表进行批量插入,对于Mybatis来说,也是非常简单的. 先看dao层 void insertBatch(@Param("tableName" ...
- 2025羊城杯网络安全大赛 wp
ycb wp Web ez_unserialize <?php error_reporting(0); highlight_file(__FILE__); class A { public $f ...
- 【Vue3】解决电脑分辨率125%、150%及缩放导致页面变形的问题
最近在做一个项目,突然发现由于调整电脑的分辨率导致页面变形的问题.正常电脑显示的是100%,当调整电脑缩放至125%时,页面发生变形,由于css设置问题,变形部分的页面设置不可拖拽和显示,严重影响项目 ...
- Toposort
拓扑排序 今天2025.10.16 经过 \(hwh\) 和 \(cxy\) 的指导,我也是初步学会了 \(markdown\),必须得写一篇文章练练手.写得格式可能不太好,没逝,一定会好起来的 好了 ...