java并发:Condition的应用
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的应用的更多相关文章
- JAVA并发-Condition
简介 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5后,Java提供了Lock接口, ...
- Java并发Condition接口
java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力,直到给定的条件为真. Condition对象必须绑定到Lock,并使用newCondition( ...
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- java并发编程——通过ReentrantLock,Condition实现银行存取款
java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价. Lock 接口 ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- Java并发编程原理与实战二十二:Condition的使用
Condition的使用 Condition用于实现条件锁,可以唤醒指定的阻塞线程.下面来实现一个多线程顺序打印a,b,c的例子. 先来看用wait和notify的实现: public class D ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java并发(十一):Condition条件
先做总结: 1.为什么使用Condition条件? synchronized配合Object的wait().notify()系列方法可以实现等待/通知模式. Lock提供了条件Condition,对线 ...
- 006 Java并发编程wait、notify、notifyAll和Condition
原文https://www.cnblogs.com/dolphin0520/p/3920385.html#4182690 Java并发编程:线程间协作的两种方式:wait.notify.notifyA ...
随机推荐
- 微信小程序之for循环
在微信小程序中也有for循环,用于进行列表渲染. 官方实例 打开微信开发者文档,在框架部分的视图层-->wxml-->列表渲染中可以看到官方给出的for循环实例,在实例中 可以看到下面相关 ...
- AppScan代理扫描app/H5安全测试(没试过,记录在此)
标签: 1.首先设置AppScan代理,设置如下:
- appiu 笔记
1.要在手机上输入字符, 要屏蔽手机键盘 于是可以想办法屏蔽软键盘,只需在desired_caps{}设置里面加两个参数 unicodeKeyboard是使用unicode编码方式发送字符串reset ...
- XStream和Dom4j的区别
对于搞技术的人来说,xml文件的处理应该并不陌生吧,先总述下,个人感觉XStream在处理XML文件和JavaBean对象互转时比较好,dom4j对常用的xml配置文件操作比较好点:首先,Dom4j ...
- 本地环境 XAMPP+phpStorm+XDebug+chrome配置和断点调试 注册方法
我的安装环境:XAMPP版本号V3.1.0 ;phpStorm版本8.0.3;windowsxp 32bit.您老人家先过目一下,不然怕影响意义. XAMPP.phpStorm 都直接安装在了D盘根目 ...
- ThinkPHP框架学习摘要
框架在linux与win下区别 1.文件权限设置: 2.大小写不规范: 学习框架的基本思路 : 1.如何收入并配置框架: 2.Controller的命名规范与书写规范: 3.Model的命名规范与书写 ...
- python post提交数据
使用utf8编码,value是上传的值 1.上传经纬度等数据http://112.74.44.47/VehicleWeb/Acceleration?gps=gpsValue&accelera ...
- node 删除文件 和文件夹
删除文件 var fs = require('fs'); fs.unlink(path,callback); 删除文件夹 deleteFolder(path); function deleteFold ...
- c++builder XE6 线程 tthread
thread TThread class TSleepFunc : public TCppInterfacedObject<TProc> { public: TSleepFunc(TFor ...
- 程序员必看:给你一份详细的Spring Boot知识清单
在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Sp ...