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条件对象的更多相关文章

  1. java Condition条件变量的通俗易懂解释、基本使用及注意点

    最近在看pthread方面的书,看到条件变量一节的时候,回忆了下java中条件变量的使用方式. java中条件变量都实现了java.util.concurrent.locks.Condition接口, ...

  2. python多线程--Condition(条件对象)

    Condition class threading.Condition(lock=None 这个类实现条件变量对象.条件变量允许一个或多个线程等待,知道它们被另一个线程唤醒. 如果给出了lock参数而 ...

  3. java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)

    Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...

  4. Java多线程——Condition条件

    简介 Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signa ...

  5. Java并发(十一):Condition条件

    先做总结: 1.为什么使用Condition条件? synchronized配合Object的wait().notify()系列方法可以实现等待/通知模式. Lock提供了条件Condition,对线 ...

  6. java 多线程(三)条件对象

    转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47417383 在上一篇博客中,我们学会了用ReentrantLock来控制线程訪问 ...

  7. Java并发包源码学习系列:详解Condition条件队列、signal和await

    目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...

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

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

  9. Java学习——面对对象的思想入门

          本文是看过<head first Java>之后的一点感悟,写点东西帮忙以后回忆,Java目前在我的工作中用到还不多,而我又对面对对象的编程非常的感兴趣.曾经在MFC平台上写过 ...

  10. 锁对象-条件对象-synchronized关键字

    1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import ja ...

随机推荐

  1. 杂题选讲II

    Clique Connect AT_abc352_e 朴素的想法是按题意暴力建边跑最小生成树,发现一个联通块内的很多边是冗余的,可以相邻两点建边跑最小生成树即可. 点击查看代码 // author : ...

  2. shell 1~3学习

    SHELL1 统计文件的行数 SHELL2 打印文件的最后5行 SHELL3 监控CPU使用率 shell 1#!/bin/bash wc -l a.txt shell 2 #!/bin/bash t ...

  3. Day 02 学习JAVA流程控制

    java流程控制 1. 用户交互Scanner 通过Scanner类来获取用户的输入 基本语法 Scanner s = new Scanner(System.in); 通过Scanner类的next( ...

  4. 05.*传输层、TCP(四层)

    传输: 数据传输格式: MAC层定义了本地局域网设备的传输行为 IP层定义了整个网络端到端的传输行为 传输层定义应用程序到应用程序的传输,基于端口区分 这两层基本定义了包的特性: 网络传输是以包为单位 ...

  5. 悟空博弈框架深度研究:从技术架构到商业应用的全景分析——声明ai研究

    悟空博弈框架深度研究:从技术架构到商业应用的全景分析 一.项目背景与研究概述 悟空博弈框架是AI元人文体系中的核心组成部分,它将东方哲学智慧与现代计算技术相结合,为复杂决策场景提供了一种全新的价值博弈 ...

  6. 【LeetCode】121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不 ...

  7. 【Mongodb】入门

    概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是 ...

  8. 你必须知道的TCP和UDP核心区别,快速搞懂这两大协议!

    1. TCP (Transmission Control Protocol) 概念 TCP(传输控制协议)是一种面向连接的.可靠的传输协议.它负责将数据从源主机传输到目标主机,并确保数据的完整性.顺序 ...

  9. 主流博客文章数据分析系统+springboot+vue3实现

    前言 大家好,今天给大家带来了一个博客文章分析系统,支持目前各大主流博客(CSDN,博客园,知乎,思否,掘金), 系统可以分析文章的内容, 评论,点赞,访问.具体内容请见下面视频. 解决了登录,环境异 ...

  10. wbemtest.exe 远程连接

    如果连接本机 root\cimv2 局域网其他机器如下图.