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 ...
随机推荐
- 从Qt谈到C++(一):关键字explicit与隐式类型转换
转载:果冻虾仁 提出疑问 当我们新建了一个Qt的widgets应用工程时.会自动生成一个框架,包含了几个文件. 其中有个mainwindow.h的头文件.就是你要操纵的UI主界面了.我们看看其中的一段 ...
- phpexcel导入数据出现PHPExcel_RichText Object解决办法
在导入excel的时候会出现异常情况,有的问题出现PHPExcel_RichText object,错误代码如下 PHPExcel_RichText Object ( [_richTextElemen ...
- pandas的set_index和reset_index方法
import pandas as pd data = pd.DataFrame(np.arange(1,10).reshape(3,3),index=["a","b&qu ...
- redis windows dll 下载
https://pecl.php.net/package/redis http://blog.csdn.net/leesin2011/article/details/72801629 http://w ...
- sqoop操作之Oracle导入到HDFS
导入表的所有字段 sqoop import --connect jdbc:oracle:thin:@192.168.1.100:1521:ORCL \ --username SCOTT --passw ...
- Mongodb下载、安装、配置与使用
记得在管理员模式下运行CMD,否则服务将启动失败 一.下载 官网下载地址:https://www.mongodb.com/download-center?jmp=nav#community 为了方便下 ...
- Python常量工具类
1.定义常量类constant.py # -*- coding: utf-8 -* """常量工具类 author: Jill usage: from constant ...
- 18.scrapy中selector的用法
Selector是一个独立的模块. Selector主要是与scrapy结合使用的. 开启Scrapy shell: 1.打开命令行cmd 2.scrapy shell http://doc.scra ...
- CUDA C Programming Guide 在线教程学习笔记 Part 8
▶ 线程束表决函数(Warp Vote Functions) ● 用于同一线程束内各线程通信和计算规约指标. // device_functions.h,cc < 9.0 __DEVICE_FU ...
- zabbix修改中文乱码
参考网站; https://blog.csdn.net/open_data/article/details/47447029 字体下载网站: http://www.font5.com.cn/zitix ...