1. package com.java.concurrent;
  2.  
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6.  
  7. /**
  8. * 生产者消费者模式
  9. * @author fliay
  10. *
  11. */
  12. public class TestProductorAndConsumerByLock {
  13.  
  14. public static void main(String[] args) {
  15. ClerkByLock c = new ClerkByLock();
  16. ProductorByLock pro = new ProductorByLock(c);
  17. ConsumerByLock con = new ConsumerByLock(c);
  18. new Thread(pro,"生产者A").start();
  19. new Thread(con,"消费者B").start();
  20. new Thread(pro,"生产者C").start();
  21. new Thread(con,"消费者D").start();
  22. }
  23.  
  24. }
  25.  
  26. class ClerkByLock{
  27. //初始化产品
  28. private int product = ;
  29. //定义一个Lock锁对象
  30. private Lock lock = new ReentrantLock();
  31. //创建condition对象
  32. private Condition condition = lock.newCondition();
  33.  
  34. //进货
  35. public void get(){
  36. lock.lock();
  37.  
  38. try{
  39. while(product>=){
  40. System.out.println("产品已满!");
  41. try {
  42. //使用condition进行线程等待
  43. condition.await();
  44. } catch (InterruptedException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48. }
  49. condition.signalAll();
  50. System.out.println(Thread.currentThread().getName()+":"+ ++product);
  51. }finally{
  52. //始终会解锁
  53. lock.unlock();
  54. }
  55.  
  56. }
  57.  
  58. //卖货
  59. public void sale(){
  60. lock.lock();
  61. try{
  62.  
  63. while(product<=){
  64. System.out.println("补货中!");
  65. try {
  66. condition.await();
  67. } catch (InterruptedException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. }
  72. condition.signalAll();
  73. System.out.println(Thread.currentThread().getName()+":"+ --product);
  74. }finally{
  75. lock.unlock();
  76. }
  77.  
  78. }
  79. }
  80.  
  81. class ProductorByLock implements Runnable{
  82.  
  83. private ClerkByLock clerk;
  84.  
  85. public ProductorByLock(ClerkByLock clerk) {
  86. this.clerk = clerk;
  87. }
  88.  
  89. public void run() {
  90. for(int i=;i<;i++){
  91. clerk.get();
  92. }
  93. }
  94. }
  95.  
  96. class ConsumerByLock implements Runnable{
  97.  
  98. private ClerkByLock clerk;
  99.  
  100. public ConsumerByLock(ClerkByLock clerk) {
  101. this.clerk = clerk;
  102. }
  103.  
  104. public void run() {
  105. for(int i=;i<;i++){
  106. clerk.sale();
  107. }
  108. }
  109. }

欢迎大家加入java资源免费分享群,群号:814657026

使用Lock锁生产者消费者模式的更多相关文章

  1. 【多线程】--生产者消费者模式--Lock版本

    在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...

  2. python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

    (1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...

  3. day 28 :进程相关,进程池,锁,队列,生产者消费者模式

    ---恢复内容开始--- 前情提要: 一:进程Process  1:模块介绍 from multiprocessing import Process from multiprocessing impo ...

  4. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  5. Java 生产者消费者模式详细分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)

    一.守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes a ...

  7. java ReentrantLock结合条件队列 实现生产者-消费者模式 以及ReentratLock和Synchronized对比

    package reentrantlock; import java.util.ArrayList; public class ProviderAndConsumerTest { static Pro ...

  8. Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码

    说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notify ...

  9. python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)

    #######################总结######### 主要理解 锁      生产者消费者模型 解耦用的   队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...

随机推荐

  1. ssh (免密码登录、开启服务)

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Unbutun为例.有机器A(192.168.1.155),B(192.168.1.181).现想 ...

  2. 移植Linux-3.4.2内核到S3C2440

    一.BootLoader引导内核过程     1.Bootloader的工作     1.1.将内核读入内存     2.2.保存内核启动参数到指定位置,内核启动时去这个位置解析参数     3.3. ...

  3. Windows下memcached的安装配置

    下载windows 32位或64位 memcached 下载 memcached_dll 1.将第一个包解压放某个盘下面,比如在c:\memcached.2.在终端(也即cmd命令界面)下输入 'c: ...

  4. java中的finally用return也挡不住

    今晚做了科达的题,有一题就是这个意思,我自以为return中断一切,然而事实摆在眼前:

  5. Ubuntu16.04 install jdk-8u144-linux-x64.tar.gz

    打开终端: Ctrl+Alt+T 下载jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b ...

  6. java泛型使用总结

    1. 泛型方法: 2. 泛型类: 3. 通配符. 1.泛型方法 泛型方法在调用时可以接收不同类型的参数.根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用. 下面是定义泛型方法的规则: 所有 ...

  7. javascript中call()、apply()、bind()的用法终于理解

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  8. java 学习笔记 读取配置文件的三种方式

    package com.itheima.servlet.cfg; import java.io.FileInputStream; import java.io.FileNotFoundExceptio ...

  9. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  10. 第九章 MySQL中LIMIT和NOT IN案例

    第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...