多线程中Condition的用法与Object中wait、notify、notifyAll用法非常的相似
Condition与Lock对象搭配完成等待唤醒机制
首先我们需要创建Condition对象

newCondition();//返回Condition实例

首先我们知道wait、notify使用前提是通过synchronized获取锁对象,而Condition对象也需要在使用前获取锁。此时获取锁是通过Lock的lock()方法获取锁。

Condition能够支持不响应中断,而通过使用Object方式不支持
Condition能够支持多个等待队列(new 多个Condition对象),而Object方式只能支持一个
Condition能够支持超时时间的设置,而Object不支持
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class Test {public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();Condition condition =lock.newCondition();T1 t1 = new T1("线程1",lock,condition);t1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}T2 t2 = new T2("线程2",lock,condition);t2.start();}
}
class T1 extends Thread{ReentrantLock lock;Condition condition;public T1(String name,ReentrantLock lock,Condition condition){super(name);this.lock = lock;this.condition = condition;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"尝试获取锁");lock.lock();try {System.out.println(Thread.currentThread().getName()+"成功获取锁,进入休眠");condition.await();} catch (InterruptedException e) {e.printStackTrace();}finally {lock.unlock();}System.out.println(Thread.currentThread().getName()+"成功释放锁");}
}class T2 extends Thread{ReentrantLock lock;Condition condition;public T2(String name,ReentrantLock lock,Condition condition){super(name);this.lock = lock;this.condition = condition;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"尝试获取锁");lock.lock();try {System.out.println(Thread.currentThread().getName()+"成功获取锁");condition.signal();System.out.println(Thread.currentThread().getName()+"准备唤醒锁");Thread.sleep(3000);}catch (Exception e){e.printStackTrace();} finally{System.out.println(Thread.currentThread().getName()+"成功唤醒锁");lock.unlock();}}
}

带参数的方法在超时后会继续进行!
await(long time, TimeUnit unit) 超时之后自动返回
1.超时后自动返回false
2.超时前被唤醒返回true

一个锁支持多个Condition

模拟生产者消费者的问题

import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class LockQueueDemo {ReentrantLock lock = new ReentrantLock();LinkedList list = new LinkedList();Condition condition1 = lock.newCondition();//生产者条件Condition condition2 = lock.newCondition();//消费者条件//定义一个方法用于生产者public void shengChan(){lock.lock();try{while(list.size() == 1){//此时生产者开始等待condition1.await();}System.out.println("生产者开始生产");list.add("商品1");System.out.println("已经生产好了,可以消费");condition2.signal();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
public void xiaoFei(){lock.lock();try{while(list.size() == 0){//消费者开始等待condition2.await();}System.out.println("消费者开始消费");list.removeFirst();System.out.println("消费完毕,请开始生产");condition1.signal();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
}public static void main(String[] args) {LockQueueDemo lockQueueDemo = new LockQueueDemo();for (int i = 0; i < 5; i++) {new Thread(new Runnable() {@Overridepublic void run() {lockQueueDemo.shengChan();}}).start();}for (int i = 0; i < 5; i++) {new Thread(new Runnable() {@Overridepublic void run() {lockQueueDemo.xiaoFei();}}).start();}
}
}


Condition中等待唤醒机制和Object对象中的等待唤醒机制十分的相似,可以类比使用。

多线程中Condition的用法相关推荐

  1. C#多线程中lock的用法

    最近在看些c#的代码,发现很多是以前没有接触到了,只能上网查,把比较好的整理下来. 经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于这些操作我们以前往往不能很好的进行处理,自从C# ...

  2. Java中condition的用法_java5 Condition用法--实现线程间的通信

    Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...

  3. python如何使用多线程_Python多线程与多线程中join()的用法

    Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一: 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置 ...

  4. mysql中condition的用法_理解Condition的用法

    packagelocks;importjava.util.Random;importjava.util.concurrent.locks.Condition;importjava.util.concu ...

  5. 多线程中join()的用法

    Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行. public class TestThread5 {public static void main(String[ ...

  6. Java中condition的用法_java condition 使用

    Condition是在java1.5才出现.它用来替换传统的 wait(), notify()实现线程之间的协作.但是更加强大. Condition用 await(), signal, signalA ...

  7. mysql中condition的用法,mybatis的condition使用

    实体类等不赘述. 1.新建一个BaseMapper文件,继承几种基础mapper,可根据需求自行添加 public interface MyMapper extends BaseMapper, Con ...

  8. Python 多线程中的 join() 和 setDaemon()

    Demo 是最好的老师!!! 参考链接:Python多线程与多线程中join()的用法 - cnkai - 博客园 知识点一(setDaemon(False)): 当一个进程启动之后,会默认产生一个主 ...

  9. c# 多线程中lock用法的经典实例

    一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行, ...

最新文章

  1. Scrum 冲刺博客第二篇
  2. Java中的文件下载
  3. go语言api源码中文版_Go语言学习——sync.map源码剖析
  4. eShopOnContainers 是一个基于微服务的.NET Core示例框架
  5. 19-Harris角点检测
  6. 联想e480一键恢复小孔_联想电脑如何一键恢复系统
  7. nodejs missing script: dev_nodejs深入学习系列之v8基础篇
  8. python excel取列_python取excel表格第一列数据-python操作excel,使用xlrd模块,获取某一列数据的......
  9. php刷新父页面,layui: 子iframe关闭/传值/刷新父页面
  10. 玩转Python大数据分析 《Python for Data Analysis》的读书笔记-第08页
  11. FydeOS for PC v6.0 发布,安卓子系统升级到 Pie
  12. typedef NS_ENUM 等枚举介绍
  13. 【汉字识别】基于matlab SVM汉字识别【含Matlab源码 830期】
  14. css鼠标移上去向上移动,css3鼠标移动图片上移效果
  15. [FROM VIJOS]安装服务器
  16. 计算机端口错误678,Win8宽带连接出现错误678的解决方法
  17. Abp 添加阿里云短信发送
  18. 关于提升短信ROI,我的6点思考
  19. 使用U盘或移动硬盘制作系统盘
  20. VSCode的LeetCode插件中国区账号密码登录错误

热门文章

  1. ns3利用FlowMonitor进行网络性能分析
  2. opencv图像尺寸缩放
  3. java中使用常见的几种监听器实现一种形似“水滴”的图形
  4. 算法提高 身份证号码升级
  5. 米转经纬度;经纬度算距离
  6. 苏宁“乱入”智能硬件,两个王炸,一片狼藉
  7. Photoshop材质系列:大理石(转)
  8. 没事脱脱发,Python爬取“手机铃声”网站的音频文件
  9. 内蒙古小学教资计算机,2021内蒙古教资面试小学信息技术学科考题规律及趋势...
  10. 2022年陕西省安全保护服务人员(初级保安员)考试练习题及答案