Condiction对象能够让线程等待,也能够唤醒相应的线程,通过下面方法,具体看代码:
await();
signal();
signalAll();

使用步骤:
1)创建锁
2)通过锁拿到Condiction对象
3)Condiction对象等待后,就需要别人唤醒才会继续执行该进程

例子代码:

  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4.  
  5. public class NewProducerConsumerCondition
  6. {
  7.  
  8. public static void main(String[] args)
  9. {
  10. Resource r = new Resource();
  11.  
  12. //2,创建线程任务。
  13. Producer pro = new Producer(r);
  14. Consumer con = new Consumer(r);
  15.  
  16. //3,创建线程。
  17. Thread t1 = new Thread(pro);
  18. Thread t2 = new Thread(pro);
  19. Thread t3 = new Thread(con);
  20. Thread t4 = new Thread(con);
  21.  
  22. t1.start();
  23. t2.start();
  24. t3.start();
  25. t4.start();
  26. }
  27.  
  28. }
  29.  
  30. class Resource{
  31. private String name;
  32. private int count = 1;
  33. private final Lock lock = new ReentrantLock();
  34. private Condition produce = lock.newCondition();
  35. private Condition consume = lock.newCondition();
  36. private boolean flag = false;
  37. public void set(String name)
  38. {
  39. lock.lock();
  40. try{
  41. while(flag){
  42. try{produce.await();}catch(Exception e){} //Condiction对象等待
  43. }
  44. this.name = name + count;
  45. count += 1;
  46. System.out.println(Thread.currentThread().getName()+"-----生产者-------"+this.name);
  47. flag = true;
  48. consume.signalAll();
  49. }finally{
  50. lock.unlock();
  51. }
  52. }
  53.  
  54. public void out()
  55. {
  56. lock.lock();
  57. try{
  58. while(!flag){
  59. try{consume.await();}catch(Exception e){}
  60. }
  61. System.out.println(Thread.currentThread().getName()+"-----消费者-------"+this.name);
  62. flag = false;
  63. produce.signalAll();
  64. }finally{
  65. lock.unlock();
  66. }
  67. }
  68. }
  69.  
  70. class Producer implements Runnable
  71. {
  72. private Resource r ;
  73. // 生产者一初始化就要有资源,需要将资源传递到构造函数中。
  74. Producer(Resource r)
  75. {
  76. this.r = r;
  77. }
  78. public void run()
  79. {
  80. while(true)
  81. {
  82. r.set("大白兔奶糖");
  83. }
  84. }
  85. }
  86.  
  87. class Consumer implements Runnable
  88. {
  89. private Resource r ;
  90. // 消费者一初始化就要有资源,需要将资源传递到构造函数中。
  91. Consumer(Resource r)
  92. {
  93. this.r = r;
  94. }
  95. public void run()
  96. {
  97. while(true)
  98. {
  99. r.out();
  100. }
  101. }
  102.  
  103. }
  1. class BoundedBuffer
  2. {
  3. final Lock lock = new ReentrantLock();// 锁
  4. final Condition notFull = lock.newCondition(); // 生产
  5. final Condition notEmpty = lock.newCondition(); // 消费
  6.  
  7. final Object[] items = new Object[100];// 存储商品的容器。
  8. int putptr/* 生产者使用的角标 */, takeptr/* 消费者使用的角标 */, count/* 计数器 */;
  9.  
  10. /* 生产者使用的方法,往数组中存储商品 */
  11. public void put(Object x) throws InterruptedException
  12. {
  13. lock.lock();
  14. try {
  15. while (count == items.length) // 判断计数器是否已到数组长度。满了。
  16. notFull.await();// 生产就等待。
  17.  
  18. items[putptr] = x; // 按照角标将商品存储到数组中
  19.  
  20. if (++putptr == items.length) // 如果存储的角标到了数组的长度,就将角标归零。
  21. putptr = 0;
  22. ++count;// 计数器自增。
  23. notEmpty.signal();// 唤醒一个消费者
  24. } finally {
  25. lock.unlock();
  26. }
  27. }
  28.  
  29. public Object take() throws InterruptedException
  30. {
  31. lock.lock();
  32. try {
  33. while (count == 0) // 如果计数器为0,说明没有商品,消费者等待。
  34. notEmpty.await();
  35. Object x = items[takeptr]; // 从数组中通过消费者角标获取商品。
  36.  
  37. if (++takeptr == items.length) // 如果消费的角标等于了数组的长度,将角标归零。
  38. takeptr = 0;
  39. --count;// 计数器自减。
  40. notFull.signal();// 唤醒生产者。
  41. return x;
  42. } finally {
  43. lock.unlock();
  44. }
  45. }
  46. }

能存多个商品的店

015.2Condiction接口的更多相关文章

  1. 第11章 拾遗1:网络地址转换(NAT)和端口映射

    1. 网络地址转换(NAT) 1.1 NAT的应用场景 (1)应用场景:允许将私有IP地址映射到公网地址,以减缓IP地址空间的消耗 ①需要连接Internet,但主机没有公网IP地址 ②更换了一个新的 ...

  2. 第10章 网络安全(5)_访问控制列表ACL

    6. 访问控制列表ACL 6.1 标准访问控制列表 (1)标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件.即,所有的条件都是基于源IP地址的. ②基本不允许或拒绝整个协议组 ...

  3. linux 学习笔记一

    Linux 学习笔记一 计算机 主要分为五个部分:控制器,运算器,存储器,输入设备,输出设备. 操作系统 操作系统就是针对硬件编写的程序,同时提供硬件接口调用的接口.操作系统需要处理如管理与配置内存. ...

  4. Linux-两种磁盘分区方式

    Linux文件设备 要理解Linux,首先要理解Linux文件结构 在Linux操作系统中,几乎所有的设备都位于/dev目录中 名称 作用 位置 SATA接口 电脑硬盘接口 /dev/sd[a-p] ...

  5. 015.1 Lock接口

    内容:Lock接口使用步骤,同步生产大白兔奶糖的例子 同步代码块的锁是隐式的,显式容易让我们理解.所以我们使用这个显式的方法,方便理解代码.######实现同步步骤:1.获取锁:lock()2.同步代 ...

  6. ledisdb:支持类redis接口的嵌入式nosql

    ledisdb现在可以支持嵌入式使用.你可以将其作为一个独立的lib(类似leveldb)直接嵌入到你自己的应用中去,而无需在启动单独的服务. ledisdb提供的API仍然类似redis接口.首先, ...

  7. 【高速接口-RapidIO】2、RapidIO串行物理层的包与控制符号

    一.RapidIO串行物理层背景介绍 上篇博文提到RapidIO的物理层支持串行物理层与并行物理层两种,由于Xilinx 部分FPGA内部已经集成了串行高速收发器,所以用FPGA实现RapidIO大多 ...

  8. PHP开发接口,封装方法

    接口的主要功能是从服务器端获取数据,然后渲染到客户端 其主要的实现流程一般会经历这样的几个阶段服务器端----> 数据库|缓存 ----> 调用接口 ---->客户端 在接口数据传输 ...

  9. 如何在编辑框中使用IAutoComplete接口(转载)

    出自:http://www.vckbase.com/index.php/wv/27.html 如果可能我想用打包类来实现.唉!,就叫我封装先生吧. 你算是找对地方了.但是我要先声明我的解决办法不是你所 ...

随机推荐

  1. 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境(服务器端及客户端)(转)

    近期想改公司内部的源码管控从TFS为git,发现yubinfeng大侠有关git的超详细大作,现将其转载并记录下,以防忘记,其原博客中有更加详细的git及.net开发相关内容.原文地址:http:// ...

  2. R语言数据重塑cbind+rbind+merge+ melt+cast

    R语言中的数据重塑是关于变化的数据分为行和列的方式.大多数R地数据处理的时候是通过将输入的数据作为一个数据帧进行.这是很容易提取一个数据帧的行和列数据,但在某些情况,当我们需要的数据帧的格式是不同的来 ...

  3. Visual Studio 2017 远程调试(Remote Debugger)应用

    I.远程调试情景 项目部署在远程服务器或非本地环境中,需要 处理应用中遇到的一些错误时 (不能直接附加进程或F5调试应用). II. 远程调试准备 1.远程服务器--操作系统和硬件要求 MSDN 操作 ...

  4. android的计算器

    今天我闲着无聊,便想仿照Iphone的计算器自己写一个出来玩玩,于是就开动脑经,来场头脑风暴了!我拿什么了写呢?wp?这是个不错的选择,但是我最近在研究安卓的开发(求各位MSP不要烧我,我买不起MAC ...

  5. oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 --------关闭防火墙试试

    oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 但是使用sqlplus可以连接 ping 本机127.0.0.1 显示一般故障 后关闭防火墙,问题解决. ps:登录时使用@ ...

  6. [译]用R语言做挖掘数据《四》

    回归 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: 1. ...

  7. 深入理解Java线程池:ScheduledThreadPoolExecutor

    介绍 自JDK1.5开始,JDK提供了ScheduledThreadPoolExecutor类来支持周期性任务的调度.在这之前的实现需要依靠Timer和TimerTask或者其它第三方工具来完成.但T ...

  8. fieldset、legend、display html元素

    fieldset 定义和用法 fieldset 元素可将表单内的相关元素分组. <fieldset> 标签将表单内容的一部分打包,生成一组相关表单的字段. 当一组表单元素放到 <fi ...

  9. python用random产生验证码,以及random的一些其他用法

    产生随机验证码函数 import random def get_code(): code = '' for i in range(5): num = str(random.randrange(10)) ...

  10. .net C# Sql数据库SQLHelper类

    using System;using System.Collections.Generic;using System.Text;using System.Collections;using Syste ...