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 ...
随机推荐
- ios oc单例宏定义
转载请注明出处!!! #undef AS_SINGLETON #define AS_SINGLETON( __class ) \ - (__class *)sharedInstance; \ + (_ ...
- 一款带有AI功能的markdown工具
大家好,我是晓凡. 写在前面 关注晓凡的同学都知道,晓凡是一名程序员. 平常有空的时候会写写博客,将一些技术干货或者踩过的坑分享给大家. 和我一样写技术博客的小伙伴都知道,平常素材来源太杂: 脑子里突 ...
- 基于element二次封装message
基于element二次封装弹出框 一.简单封装Message 在components创建个Message/index.js index.js代码: export function alertOK(ms ...
- 上线别再“一刀切”!Gateway 做流量染色 + 灰度发布,告别线上事故
大家好,我是小富- 最近团队迭代频繁,连续几周都在做新功能上线,从测试环境验证到生产环境放量,全程谨小慎微没出一次故障,主要是用好了 Spring Cloud Gateway 的 流量染色 和 灰度发 ...
- Mybatis plus之LambdaQueryWrapper使用sum函数求和,你会用吗
MyBatis-Plus 实现按字段求和查询的通用方案 在使用 MyBatis-Plus 进行开发时,经常会遇到需要对查询数据按某个字段求和的需求,而 MyBatis-Plus 本身并不直接支持 SU ...
- 使用Scalar.AspNetCore来管理你的OpenApi
一直觉得很好的一个组件,网上介绍少得可怜,没办法,只有自己爬官网了,又是对照git又是看doc文档,总算是玩明白了,现在完全抛弃那个谁谁谁了.因人喜好各取所长吧 先来官方参考地址: https://l ...
- KAL1 LINUX 官方文档之安装 --- 安装加密磁盘
有时,我们希望使用全盘加密来加密敏感数据.使用ka1i Installer,您可以在硬盘或USB驱动器上启动LVM加密安装.安装过程与"常规ka1i Linux安装"非常相似,不同 ...
- 软件研发 --- hello world 项目 之 windows系统脚本 bat
软件研发"Hello World"项目之 Windows 系统脚本版 的完整示例 一.创建项目结构在你的 Windows 文件夹中(如:C:\Users\YourName\Proj ...
- XPOSED优秀模块列表 --- Snapchat 完整字幕
启用此模块将允许您在标题中输入无限量的文本. 作者: elesbb 支持/讨论网址: http://forum.xda-developers.com/xposed/modules/app-sn ...
- 工作错误记录---执行java报错 类 是公共的, 应在文件中声明
现象 day3test5.java:9: 错误: 类 Vehicle 是公共的, 应在名为 Vehicle.java 的文 件中声明public class Vehicle { ^1 个错误 原因 当 ...