Java中condition的用法_java condition 使用
Condition是在java1.5才出现。它用来替换传统的 wait(), notify()实现线程之间的协作。但是更加强大。
Condition用 await(), signal, signalAll方法替代wait(), notify()。假如用wait,notify,有三个线程调用一个对象的某个方法,notify只能随机的唤醒一个线程,而不能指定唤醒某个线程,但是用condition的话,就可以唤醒指定的线程。可以看下面的例子。
condition的await,signal和 wait,notify都需要在锁之间运行。
contidion也被用来实现阻塞队列。
condition是通过锁创建出来的。基本代码是 ReentrantLock.newCondition().
lock.lock();
condition.await();
lock.unlock();
View Code
下面实现一个 一直abc abc这么有顺序的执行。
下面用synchronized , wait ,notify来实现。
总共有四个类。DemoNoCondition, A,B,C. 其中DemoNoCondition内部有三个方法,a,b,c,都加上了锁,用来打印abc的。A B C三个类,用来表示多个线程调用DemoNoCondition的几个方法来打印abc
packagecom.citi.test.mutiplethread.demo5;public classDemoNoCondition {private intsignal;public synchronized voida(){while(signal!=0){try{
wait();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("a"+signal);
signal++;
notifyAll();
}public synchronized voidb(){while(signal!=1){try{
wait();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("b"+signal);
signal++;
notifyAll();
}public synchronized voidc(){while(signal!=2){try{
wait();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("c"+signal);
signal=0;
notifyAll();
}public static voidmain(String[] args) {
DemoNoCondition d=newDemoNoCondition();
A a=newA(d);
B b=newB(d);
C c=newC(d);newThread(a).start();newThread(a).start();newThread(a).start();newThread(a).start();newThread(c).start();newThread(c).start();newThread(c).start();newThread(c).start();newThread(b).start();newThread(b).start();newThread(b).start();newThread(b).start();newThread(b).start();
}
}
packagecom.citi.test.mutiplethread.demo5;public class A implementsRunnable{privateDemoNoCondition demoCondition;publicA(DemoNoCondition demo) {this.demoCondition=demo;
}
@Overridepublic voidrun() {while(true){
demoCondition.a();try{
Thread.sleep(1000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
packagecom.citi.test.mutiplethread.demo5;public class B implementsRunnable {privateDemoNoCondition demoCondition;publicB(DemoNoCondition demoCondition) {this.demoCondition=demoCondition;
}
@Overridepublic voidrun() {while(true){
demoCondition.b();try{
Thread.sleep(1000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
packagecom.citi.test.mutiplethread.demo5;public class C implementsRunnable {privateDemoNoCondition demoCondition;publicC(DemoNoCondition demoCondition) {this.demoCondition=demoCondition;
}
@Overridepublic voidrun() {while(true){
demoCondition.c();try{
Thread.sleep(1000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
下面是输出结果。
下面来看看用condition来实现这个功能。代码其实是类似的,只不过,用condition,可以指定唤醒某个线程。可以对比一下两个实现的代码,一个是用notifyAll,一个是直接指定
c.signal,来通知线程c唤醒。这个就是condition的强大之处。
packagecom.citi.test.mutiplethread.demo5;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classDemoCondition {private intsignal;private Lock lock=newReentrantLock();private Condition a=lock.newCondition();private Condition b=lock.newCondition();private Condition c=lock.newCondition();public voida(){
lock.lock();while(signal!=0){try{
a.await();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("a"+signal);
signal++;
b.signal();
lock.unlock();
}public voidb(){
lock.lock();while(signal!=1){try{
b.await();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("b"+signal);
signal++;
c.signal();
lock.unlock();
}public voidc(){
lock.lock();while(signal!=2){try{
c.await();
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("c"+signal);
signal=0;
a.signal();
lock.unlock();
}public static voidmain(String[] args) {
DemoCondition condition=newDemoCondition();
ACondition a=newACondition(condition);
BCondition b=newBCondition(condition);
CCondition c=newCCondition(condition);newThread(b).start();newThread(a).start();newThread(a).start();newThread(b).start();newThread(c).start();newThread(a).start();newThread(c).start();newThread(a).start();newThread(c).start();newThread(c).start();
}
}
packagecom.citi.test.mutiplethread.demo5;public class ACondition implementsRunnable {privateDemoCondition condition;publicACondition(DemoCondition condition) {this.condition=condition;
}
@Overridepublic voidrun() {while(true){
condition.a();try{
Thread.sleep(1000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
packagecom.citi.test.mutiplethread.demo5;public class BCondition implementsRunnable {privateDemoCondition condition;publicBCondition(DemoCondition condition) {this.condition =condition;
}public voidrun() {while(true){
condition.b();try{
Thread.sleep(1000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
packagecom.citi.test.mutiplethread.demo5;public class CCondition implementsRunnable {privateDemoCondition condition;publicCCondition(DemoCondition condition) {this.condition =condition;
}
@Overridepublic voidrun() {while(true){
condition.c();try{
Thread.sleep(1000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Java中condition的用法_java condition 使用相关推荐
- java中contains的用法_java容器中所有接口和类的用法
我这里讲一下如何下载java的api文档 还有就是容器和容器之间进行的操作 每一个地方称之为一个节点,每一个节点包含了3部分(上一个节点,下一个节点,以及我们自己的数据部分) 需要多个线程共享的时候 ...
- java中的replace用法_java中replace用法举例:replace(char oldChar, char newChar)返回一个新的字符串...
1.JAVA中,char占2字节,16位.可在寄存汉字 2.java中replace用法举例:replace(char oldChar, char newChar)返回一个新的字符串,它是经过用 ne ...
- java中static的用法_Java类中static的用法
关于Java中static的使用有以下四种情况: 1.静态成员变量 被static修饰的成员变量,叫静态成员变量或类变量:没有被static修饰的变量,叫实例变量. 两者的区别是: 静态 ...
- java中toarray()的 用法_java容器中toArray的用法
请高手帮我看看toArray的用法其返回的是哈希码是不是需要重写importjava.util.*;publicclassTest1{publicstaticvoidmain(String[]args ...
- java 中subtract的用法_java中BigDecimal加减乘除基本用法
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...
- JAVA中dot的用法_Java 方法
方法(有的人喜欢叫函数)是一段可重用的代码段. 一.方法的使用 1. 方法定义 方法定义的语法形式: [修饰符] 返回值类型 方法名([参数类型 参数名]){ ... 方法体 ...return返回值 ...
- java中stringtokenizer的用法_Java中 StringTokenizer 的用法
一.StringTokenizer 1.1 StringTokenizer简介及其构造函数的三种形式: StringTokenizer类是字符串分割解析类型,其属于java.util包,在使用之前需要 ...
- java中rename的用法_Java File中renameTo的介绍和使用说明
看到项目中有个地方用的File的renameTo这个方法,本以为这个方法就是用来文件重命名的,但是项目中确用它来进行文件的移动.就是使用renameTo将一个文件从一个目录移动另一个目录下! 下面就简 ...
- java中inner的用法_Java——内部类(inner class)
packagecy.内部类.静态内部类;public classStaticOuter {private static String name = "Outer";private ...
最新文章
- java 数组的基本操作
- OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤
- 写了一个好玩的小软件, 监视鼠标以及键盘的动作, 全局钩子. HowTired
- ubuntu mysql navicat_Ubuntu搭建MySQL,Navicat Premium连接
- 2020年数据中心值得关注的8大趋势
- Linux CPU数、物理核、逻辑核的查看方法及线程进程的绑定方法
- php防止跨域提交,PHP防止跨域提交表单的简单示例
- 报告 | 斯坦福2019 AI年度报告出炉!700亿美元投入AI,自动驾驶融资最多
- java并发包作者lee_Java的一些并发包
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
- [Erlang 0022] It solves the right problems in the right way at the right time
- word文档里面怎样自动生成目录
- miRNA 在基因调控中的作用
- 关于物联网,互联网我们用到的通信
- NVIDIA NCCL 源码学习(五)- 路径计算
- 关于人工智能不会使大脑变懒惰的议论文_台湾人工智能学校执行长陈升玮:孩子成为这型人,就不怕被AI取代...
- 网易企业邮箱SMTP
- STM32 Simulink 自动代码生成电机控制:基于反电动势观测器的锁相环设计
- 江苏28岁美女法医2年内检验400具尸体(图)
- 解决运行roscore时出现报错问题
热门文章
- MS08067红队攻防第四期 开班啦~
- matlab filter2和imfilter有什么区别
- 介绍:教育研究:定量,定性和混合方法——伯克约翰逊,拉里克里斯滕森著
- eMMC Spec —— 1.eMMC前言介绍
- 宝塔面板安装mediawiki
- 抖音拍摄技巧 甩布-2018如何做好视频伪原创
- Android中View类OnClickListener和DialogInterface类OnClickListener冲突
- Linux系统下安装配置 Nginx 超详细图文教程
- The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i
- 图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像