Condition类可以使线程等待,也可以唤醒线程。
Condition类的await方法和Object类的wait方法等效
Condition类的signal方法和Object类的notify方法等效
Condition类的signalAll方法和Object类的notifyAll方法等效

注意:awit(),signal(),signalAll()这些方法,都必须先进行线程同步后,才可以使用,否则会报错:IllegalMonitorStateException
示例如下:

public class ConditionDemo {
private static Lock lock=new ReentrantLock();
private static Condition condition=lock.newCondition(); public static void main(String[] args) {
ThreadSignal threadSignal =new ThreadSignal();
threadSignal.start(); try {
System.out.println("在主线程中利用Condition阻塞线程 :"+ Thread.currentThread().getName());
condition.await();
}catch (InterruptedException e) {
e.printStackTrace();
}
} static class ThreadSignal extends Thread { @Override
public void run() {
try {
lock.lock();
System.out.println("在线程"+Thread.currentThread().getName()+"中加锁");
System.out.println("在线程"+Thread.currentThread().getName()+"中准备唤醒。");
condition.signal(); }catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
System.out.println("在线程"+Thread.currentThread().getName()+"中解锁。");
}
}
} }

以上代码在主线程中,没有进行同步或加锁,就直接使用Condition的await()方法,会出错IllegalMonitorStateException。

需要先进行加锁,再进入等待,修改如下:

public class ConditionDemo {
private static Lock lock=new ReentrantLock();
private static Condition condition=lock.newCondition(); public static void main(String[] args) {
ThreadSignal threadSignal =new ThreadSignal();
threadSignal.start(); try {
lock.lock();
System.out.println("在主线程中加锁。");
System.out.println("在主线程中利用Condition阻塞线程 :"+ Thread.currentThread().getName());
condition.await();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
System.out.println("在主线程中解锁。");
} } static class ThreadSignal extends Thread { @Override
public void run() {
try {
lock.lock();
System.out.println("在线程"+Thread.currentThread().getName()+"中加锁");
condition.signal();
System.out.println("在线程"+Thread.currentThread().getName()+"中唤醒。");
}catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
System.out.println("在线程"+Thread.currentThread().getName()+"中解锁。");
}
}
} }

运行结果如下:

在主线程中加锁。
在主线程中利用Condition使线程等待。
在线程Thread-0中加锁
在线程Thread-0中唤醒。
在主线程中解锁。
在线程Thread-0中解锁。

java并发:Condition的应用的更多相关文章

  1. JAVA并发-Condition

    简介 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5后,Java提供了Lock接口, ...

  2. Java并发Condition接口

    java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力,直到给定的条件为真. Condition对象必须绑定到Lock,并使用newCondition( ...

  3. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  4. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  5. java并发编程——通过ReentrantLock,Condition实现银行存取款

         java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价. Lock 接口 ...

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

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

  7. Java并发编程原理与实战二十二:Condition的使用

    Condition的使用 Condition用于实现条件锁,可以唤醒指定的阻塞线程.下面来实现一个多线程顺序打印a,b,c的例子. 先来看用wait和notify的实现: public class D ...

  8. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

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

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

  10. 006 Java并发编程wait、notify、notifyAll和Condition

    原文https://www.cnblogs.com/dolphin0520/p/3920385.html#4182690 Java并发编程:线程间协作的两种方式:wait.notify.notifyA ...

随机推荐

  1. Qt5布局管理(二)——QDockWidget停靠窗口类

    转载:LeeHDsniper 停靠窗口类QDockWidget 实例效果 如右图所示,左半部分MainWindow是该窗口的中心窗口,右边的最下面两个停靠窗口可以跳出该窗口: 但是第一个停靠窗口只能停 ...

  2. springMVC学习(2)

    一.使用注解的处理器映射器和适配器 1) 在这个下面的/org/springframework/web/servlet/DispatcherServlet.properties文件,从这个文件中加载处 ...

  3. request响应码记录

    响应 -- r.status_code                     #响应状态码 -- r.content                             #会自动为你解码 字节方 ...

  4. 接口测试3-4使用csv进行接口测试

    参照前面的例子 向URL发送corpid和corsecret2个参数,可以获取正确的tokenid https://qyapi.weixin.qq.com/cgi-bin/gettoken 数据 场景 ...

  5. pandas的to_csv函数

    分隔符 sep : Field delimiter for the output file (default ”,”) dt.to_csv('C:/Users/think/Desktop/Result ...

  6. Dependency Injection in ASP.NET Web API 2 Using Unity

    What is Dependency Injection? A dependency is any object that another object requires. For example, ...

  7. 深度学习中的Normalization模型

    Batch Normalization(简称 BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种场合.BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize ...

  8. python list unicode转中文显示

    [u'\u773c', u'\u8179\u90e8', u'\u4e94\u5b98', u'\u53e3\u8154', u'\u8179\u90e8', u'\u53e3\u8154'] str ...

  9. shell $*与$@的区别

    [root@bgx shell]# cat tt.sh #! /bin/bash test() { echo "未加引号,二者相同" echo $* echo $@ echo &q ...

  10. linux7安装teamViewer

    参考网站:http://blog.sina.com.cn/s/blog_15308c8290102x72u.html 下载网站:https://www.teamviewer.com/zhCN/down ...