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. springMVC集成CXF后调用已知的wsdl接口

    本文转载自:https://www.cnblogs.com/xiaochangwei/p/5400303.html 本篇文章将讲解SpringMVC+CXF环境下,怎么调用其他系统通过webServi ...

  2. jmeter监控服务器的方法

    先下载Jmeter资源监控插件,我的百度云jmeter视频里面有说. 地址如下: JMeterPlugins-Standard-1.3.1.zip  下载 https://jmeter-plugins ...

  3. java web程序 html标签中<th>和<td>的用法区别:

    <th>是用于表头式的 <td>是列 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional ...

  4. 云-AWS-百科:AWS

    ylbtech-云-AWS-百科:AWS Amazon Web Services AWS是亚马逊公司旗下云计算服务平台,为全世界范围内的客户提供云解决方案.AWS面向用户提供包括弹性计算.存储.数据库 ...

  5. 解决WPF两个图片控件显示相同图片因线程占用,其中一个显示不全的问题

    在做项目的过程中遇到这样一个问题,下面提出一种解决方法,主要思想是图片的Copy,如还有其他方法,欢迎交流. 在前端图片控件绑定显示时,使用转换器进行转义绑定   (1)转换器: public cla ...

  6. iOS whose view is not in the window hierarchy!

    解决方法: viewController只Load完毕,没有Appear,此时应该将语句转移到ViewDidAppear方法中

  7. C#中char空值的几种表示方式

    C#中char空值的几种表示方式 在C#中char类型的表示方式通常是用单引号作为分隔符,而字符串是用双引号作为分隔符. 例如: 程序代码 程序代码 char a = 'a'; char b = 'b ...

  8. 很详细的curl命令使用大全

    可以看作命令行浏览器 1.开启gzip请求 curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte 2.监控网页的响应时间 cu ...

  9. JAVA 文件与base64之间的转化, 以及Web实现base64上传文件

    <1>文件与base64字符串之间的转化 package servlet_file_upload; import java.io.File; import java.io.FileInpu ...

  10. HTML5 Canvas ( 图形变换, 升级版的星空 ) translate, rotate, scale

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...