在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition

我们使用这些新知识,来改进例子:【多线程】--生产者消费者模式--Synchronized版本

改进代码如下:

  1. package com.shindo.java.thread;
  2. import java.util.concurrent.locks.*;
  3. /**
  4. * Jdk 1.5中,提供了多线程升级解决办法
  5. * 将同步Synchronized 替换为显示的Lock操作
  6. * 将Object中的wait、notify、notifyAll替换为Condition对象
  7. * 该对象通过Lock锁进行获取
  8. * 一个锁Lock上可以有多个相关的Condition对象
  9. */
  10. public class ProducerAndConsumerPatternBetter {
  11. public static void main(String[] args){
  12. Resource2 r = new Resource2();
  13. new Thread(new Producer2(r)).start();
  14. new Thread(new Consumer2(r)).start();
  15. }
  16. }
  17.  
  18. /**
  19. * 定义资源类,负责提供商品的生产方法和消费方法
  20. */
  21. class Resource2 {
  22. //定义商品变量
  23. private String name;
  24. //定义自增长计数器
  25. private int count = 1;
  26. //定义逻辑标志位
  27. private boolean flag = false;
  28. //通过多态的方法,生成Lock对象的实例
  29. private Lock lock = new ReentrantLock();
  30. //定义生产者的Condition对象
  31. private Condition condition_pro = lock.newCondition();
  32. //定义消费者的Condition对象
  33. private Condition condition_con = lock.newCondition();
  34.  
  35. //定义产品生产方法
  36. public void set(String name) throws InterruptedException{
  37. lock.lock();
  38. try {
  39. while(flag)
  40. condition_pro.await();
  41. this.name = name + "=="+ count++;
  42. System.out.println(Thread.currentThread().getName() + "--生产者--"+ this.name);
  43. flag = true;
  44. condition_con.signal();
  45. }finally{
  46. lock.unlock();
  47. }
  48. }
  49.  
  50. //定义产品消费方法
  51. public void out()throws InterruptedException{
  52. lock.lock();
  53. try {
  54. while(!flag)
  55. condition_con.await();
  56. System.out.println(Thread.currentThread().getName()+"--##消费者##--"+this.name);
  57. flag = false;
  58. condition_pro.signal();
  59. } finally{
  60. lock.unlock();
  61. }
  62. }
  63. }
  64.  
  65. /**
  66. * 定义产品生产类
  67. */
  68. class Producer2 implements Runnable{
  69. private Resource2 res;
  70. Producer2(Resource2 res){
  71. this.res = res;
  72. }
  73. public void run(){
  74. while(true){
  75. try {
  76. res.set("商品");
  77. } catch (InterruptedException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. }
  82. }
  83.  
  84. //定义产品消费类
  85. class Consumer2 implements Runnable{
  86. private Resource2 res;
  87. Consumer2(Resource2 res){
  88. this.res = res;
  89. }
  90. public void run(){
  91. while(true){
  92. try {
  93. res.out();
  94. } catch (InterruptedException e) {
  95. e.printStackTrace();
  96. }
  97. }
  98. }
  99. }

代码执行结果如下图:

【多线程】--生产者消费者模式--Lock版本的更多相关文章

  1. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

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

    在实现生产者消费者模式之前,我们先了解一下线程的5种状态:被创建.运行.冻结.消亡.阻塞,如下图: 在Jdk1.5发布之前,我们实现生产者消费者模式一般使用synchronized + while循环 ...

  3. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  4. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  5. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  6. 多线程-生产者消费者(lock同步)

    二.采用Lock锁以及await和signal方法是实现 import java.io.IOException; import java.util.concurrent.locks.Condition ...

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

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

  8. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

  9. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

随机推荐

  1. Hive集成HBase详解

    摘要 Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询   应用场景 1. 将ETL操作的数据存入HBase 2. HB ...

  2. 关于SetCapture() 和 ReleaseCapture()的使用方法

    查MSND,对SetCapture()函数的说明为:“该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕 ...

  3. axis WebServices 完美调用天气预报,查询、显示 代码!

    axis WebServices 完美调用天气预报,查询.显示 代码! 效果: jsp页面: <%@ page language="java" import="ja ...

  4. correlated subquery and non-correlated subquery

    子查询:嵌套在其他查询中的查询称之. 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询). 所有的子查询可以分为两类,即相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查 ...

  5. React数据传递

    React基础概念 React是基于组件化的开发,通过组件的组合,让web应用能够实现桌面应用的效果. React更有利于单页应用的开发. 并非MVC框架,只能算是V 具有单项数据流的特点 优势:代码 ...

  6. SQL Server 向临时表插入数据

    INSERT INTO #DirtyOldWIPBOM SELECT TOP (100) PERCENT dbo.WIP_BOM.Model, dbo.WIP_BOM.PartNumber,WIP_B ...

  7. 有关SetTimer函数的用法

    1 )用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // ...

  8. jquery 自动实现autocomplete+ajax

    来公司也差不多一个半月了,一直做点小东西,现在在做公司的出货系统,也只是做来锻炼锻炼的. 好了 不废话了 下面是实现 jquery插件 autocomplete+ajax 自动实现.也是刚学,勿喷. ...

  9. python Cmd实例之网络爬虫应用

    python Cmd实例之网络爬虫应用 标签(空格分隔): python Cmd 爬虫 废话少说,直接上代码 # encoding=utf-8 import os import multiproces ...

  10. jquery取元素值

    var j = 1; if (rows.length > 0) { for (var i = 0; i < rows.length; i++) { var row = rows[i]; i ...