1. /*生产者与消费者第二次敲,本人表示很郁闷,以后要经常读这个
  2. * Condition 将Object类中的监视器(wait notify notifyAll)分解成不同的对象。例如condition_pro.await():
  3. * condition_com.signal();这两个语句,分别是实例化了*_pro与*_com这两个对象,分别通过调用不同的对线程操作的方法来实现对线程的操作
  4.  
  5. */
  6.  
  7. package LockMethod;
  8. import java.util.concurrent.locks.*;//condition,Lock接口都在此包中
  9. class Resource2
  10. {
  11. private String name;//私有化商品名称
  12. private int commodity=100;//私有化商品编号
  13. private boolean flag=false;//定义一个boolean 型的线程切换标记
  14. private Lock lock=new ReentrantLock();//建立一个锁的对象,多态,父类引用指向子类对象。
  15. Condition condition_pro=lock.newCondition();//实例化一个Condition对象,Condition实例实质是绑定在一个锁上,此语句表示为特定的lock对象获取Condition对象
  16. Condition condition_con=lock.newCondition();
  17. public void set(String name) throws InterruptedException//await()方法抛出异常,API文档写出。set方法为生产者生产商品
  18. { lock.lock();//上锁。目的是同为生产者的t1,t2或者同为消费者的t3T4只能按序执行,不会发生一个商品生产了两次或者被消费了两次
  19. try
  20. {
  21. while(flag)
  22. condition_pro.await();//await()方法在API文档中有抛出异常,所以在方法上需要throws 一下
  23. this.name=name+commodity++;
  24. System.out.println(Thread.currentThread().getName()+"---producer"+this.name);
  25. flag=true;//改变线程转换标记,使得当前线程再经过一次循环时可以挂那,因为生产一次,消费一次,不能使其再生产一次
  26. condition_con.signal(); //唤醒消费者的线程,使得生产的上品被消费
  27. }
  28. /*catch(Exception e)
  29. {
  30.  
  31. }*/
  32. finally//其中代码为必须要执行的语句
  33. {
  34. lock.unlock();//finally中的代码是必须要执行的,解锁,以便让下一个线程可以执行。
  35. }
  36. }
  37. public void out() throws InterruptedException//out方法为消费者消费商品
  38. {
  39. lock.lock();
  40. try
  41. {
  42. while(!flag)//在该线程未被唤醒前,已经通过flag=true;改变了判断值。所以加!使得在消费者线程执行时不指向while中的awake();使其能println()顺利被消费
  43. condition_con.await();
  44. System.out.println(Thread.currentThread().getName()+"---消费者"+this.name);
  45. flag=false;//改变标记,使消费者执行while语句,执行awake(),挂那,等待生产者生产一个商品后在次被唤醒
  46. condition_pro.signal();//唤醒生产者线程
  47. }
  48. finally
  49. {
  50. lock.unlock();//解锁
  51. }
  52. }
  53. }
  54. class Producer2 implements Runnable//实现接口,调用线程要执行的run方法
  55. {
  56. private Resource Res;//私有一个Resource对象
  57. Producer2(Resource Res)//构造函数,传入Resource对象
  58. {
  59. this.Res=Res;
  60. }
  61. public void run()//生产线程所要执行的代码
  62. {
  63. try
  64. {
  65. while(true)//while(true)记住格式,无线循环
  66. Res.set("商品");//调用生产方法,生产产品
  67. }
  68. catch(Exception e)
  69. {
  70.  
  71. }
  72. }
  73. }
  74. class Consumer2 implements Runnable
  75. {
  76. private Resource Res;//私有一个Resource对象
  77. Consumer2(Resource Res)//构造函数,传入Resource对象
  78. {
  79. this.Res=Res;
  80. }
  81. public void run()//消费线程所要执行的代码
  82. {
  83. try
  84. {
  85. while(true)
  86. Res.out();//调用消费方法,消费商品
  87. }
  88. catch(Exception e)
  89. {
  90.  
  91. }
  92. }
  93. }
  94.  
  95. public class LockMethod2
  96. {
  97. public static void main (String[] args)
  98. {
  99. Resource r=new Resource();//创建Resource对象
  100.  
  101. Consumer2 con=new Consumer2(r);//分别创建生产者消费者对象,并使其指向Resource对象
  102. Producer2 pro=new Producer2(r);
  103.  
  104. Thread t1=new Thread(pro);//创建线程1234,分别指向生产者和消费者。
  105. Thread t2=new Thread(pro);
  106. Thread t3=new Thread(con);
  107. Thread t4=new Thread(con);
  108.  
  109. t1.start();//启动线程
  110. t2.start();
  111. t3.start();
  112. t4.start();
  113. }
  114. }

Lock锁与Condition监视器(生产者与消费者)。的更多相关文章

  1. condition版生产者与消费者模式

    1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...

  2. 用ReentrantLock和Condition实现生产者和消费者模式

    前面一篇文章<wait.notify应用场景(生产者-消费者模式)>是一种生产者消费者模式实现,今晚这是Lock方式实现,下面是源码: 生产者代码: /** * 生产者 * * @auth ...

  3. 20181229(守护进程,互斥锁,IPC,生产者和消费者模型)

    一.守护进程 守护进程:一个进程B守护另一个进程A,当被守护的进程A结束,进程B也就结束了.(不一定同生,但会同死) 两个特点: ①守护进程会在主进程代码执行结束后就终止 ②守护进程内无法再开启子进程 ...

  4. 守护进程,互斥锁,IPC,生产者与消费者模型

    守护进程: b 进程守护 a进程,当a进程执行完毕时,b进程会跟着立马结束 守护进程用途: 如果父进程结束了,子进程无需运行了,就可以将子进程设置为父进程的守护进程 例如我们qq视频聊天时,当我们退出 ...

  5. ReentrantLock和Condition实现生产者和消费者

    一个生产者和一个消费者 public class ConditionTest { private static ReentrantLock lock = new ReentrantLock(); pr ...

  6. (删)Java线程同步实现二:Lock锁和Condition

    在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...

  7. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  8. 线程高级篇-Lock锁和Condition条件

    浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...

  9. java使用lock实现一个简单的生产者和消费者模式

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...

随机推荐

  1. 论文阅读笔记三十九:Accurate Single Stage Detector Using Recurrent Rolling Convolution(RRC CVPR2017)

    论文源址:https://arxiv.org/abs/1704.05776 开源代码:https://github.com/xiaohaoChen/rrc_detection 摘要 大多数目标检测及定 ...

  2. 步步为营-87-imageAreaSelect插件使用(图片剪切)

    1 引用文件 jquery.imgareaselect.min.cs imgareaselect-default.js 2 代码 <%@ Page Language="C#" ...

  3. Cannot uninstall 'html5lib'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

    如标题,安装Tensorflow-gpu时遇到的完整问题 Cannot uninstall 'html5lib'. It is a distutils installed project and th ...

  4. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  5. kudu的读取数据流程

    当客户端从Kudu的表中读取数据时,必须首先建立需要连接的系列tablet服务器. 通过执行tablet发现过程(如上所述)来确定包含要读取的主关键字范围的tablet的位置(读取不必在领导者tabl ...

  6. day8.登陆注册简单实现

    username = input('请输入注册的用户名:') password = input('请输入注册名的密码:') with open('list_of_info',mode='w',enco ...

  7. 解决 jQuery 实现父窗口的问题 如window.parent.document.getElementById().innerHTML

    因为先前遇到的问题,所以我考虑采用 IFRAME 来隔离不同的脚本,从而实现我需要的效果. 在框架中,我用 JavaScript 获取 JSON 数据,组织成 HTML 代码,最后将其填充至上层文档的 ...

  8. idea maven项目打war包 以及项目重新部署

    第一步 打war包: 这样war报就在你项目的target目录下: 第二步 部署步骤 首先进入服务器tomcat  bin 目录 关闭服务 命令:  ./shutdown.sh 然后就要进入webap ...

  9. Python学习(二十八)—— Django模板系统

    转载自http://www.cnblogs.com/liwenzhou/p/7931828.html Django模板系统 官方文档 一.常用语法 只需要记两种特殊符号: {{  }}和 {% %} ...

  10. Codeforces 922F Divisibility 构造

    Divisibility 我们考虑删数字 首先我们可以发现有一类数很特殊就是大于 n / 2的素数, 因为这些素数的贡献只有1, 并且在n大的时候, 这些素数的个数不是很少, 我们可以最后用这些数去调 ...