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 使用相关推荐

  1. java中contains的用法_java容器中所有接口和类的用法

    我这里讲一下如何下载java的api文档 还有就是容器和容器之间进行的操作 每一个地方称之为一个节点,每一个节点包含了3部分(上一个节点,下一个节点,以及我们自己的数据部分) 需要多个线程共享的时候 ...

  2. java中的replace用法_java中replace用法举例:replace(char oldChar, char newChar)返回一个新的字符串...

    1.JAVA中,char占2字节,16位.可在寄存汉字 2.java中replace用法举例:replace(char oldChar, char newChar)返回一个新的字符串,它是经过用 ne ...

  3. java中static的用法_Java类中static的用法

    关于Java中static的使用有以下四种情况: 1.静态成员变量        被static修饰的成员变量,叫静态成员变量或类变量:没有被static修饰的变量,叫实例变量. 两者的区别是: 静态 ...

  4. java中toarray()的 用法_java容器中toArray的用法

    请高手帮我看看toArray的用法其返回的是哈希码是不是需要重写importjava.util.*;publicclassTest1{publicstaticvoidmain(String[]args ...

  5. java 中subtract的用法_java中BigDecimal加减乘除基本用法

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...

  6. JAVA中dot的用法_Java 方法

    方法(有的人喜欢叫函数)是一段可重用的代码段. 一.方法的使用 1. 方法定义 方法定义的语法形式: [修饰符] 返回值类型 方法名([参数类型 参数名]){ ... 方法体 ...return返回值 ...

  7. java中stringtokenizer的用法_Java中 StringTokenizer 的用法

    一.StringTokenizer 1.1 StringTokenizer简介及其构造函数的三种形式: StringTokenizer类是字符串分割解析类型,其属于java.util包,在使用之前需要 ...

  8. java中rename的用法_Java File中renameTo的介绍和使用说明

    看到项目中有个地方用的File的renameTo这个方法,本以为这个方法就是用来文件重命名的,但是项目中确用它来进行文件的移动.就是使用renameTo将一个文件从一个目录移动另一个目录下! 下面就简 ...

  9. java中inner的用法_Java——内部类(inner class)

    packagecy.内部类.静态内部类;public classStaticOuter {private static String name = "Outer";private ...

最新文章

  1. java 数组的基本操作
  2. OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤
  3. 写了一个好玩的小软件, 监视鼠标以及键盘的动作, 全局钩子. HowTired
  4. ubuntu mysql navicat_Ubuntu搭建MySQL,Navicat Premium连接
  5. 2020年数据中心值得关注的8大趋势
  6. Linux CPU数、物理核、逻辑核的查看方法及线程进程的绑定方法
  7. php防止跨域提交,PHP防止跨域提交表单的简单示例
  8. 报告 | 斯坦福2019 AI年度报告出炉!700亿美元投入AI,自动驾驶融资最多
  9. java并发包作者lee_Java的一些并发包
  10. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
  11. [Erlang 0022] It solves the right problems in the right way at the right time
  12. word文档里面怎样自动生成目录
  13. miRNA 在基因调控中的作用
  14. 关于物联网,互联网我们用到的通信
  15. NVIDIA NCCL 源码学习(五)- 路径计算
  16. 关于人工智能不会使大脑变懒惰的议论文_台湾人工智能学校执行长陈升玮:孩子成为这型人,就不怕被AI取代...
  17. 网易企业邮箱SMTP
  18. STM32 Simulink 自动代码生成电机控制:基于反电动势观测器的锁相环设计
  19. 江苏28岁美女法医2年内检验400具尸体(图)
  20. 解决运行roscore时出现报错问题

热门文章

  1. MS08067红队攻防第四期 开班啦~
  2. matlab filter2和imfilter有什么区别
  3. 介绍:教育研究:定量,定性和混合方法——伯克约翰逊,拉里克里斯滕森著
  4. eMMC Spec —— 1.eMMC前言介绍
  5. 宝塔面板安装mediawiki
  6. 抖音拍摄技巧 甩布-2018如何做好视频伪原创
  7. Android中View类OnClickListener和DialogInterface类OnClickListener冲突
  8. Linux系统下安装配置 Nginx 超详细图文教程
  9. The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i
  10. 图像搜索引擎1|使用Python颜色直方图在数据集中搜索视觉上相似的图像