1.使用Lock和Condition的意义

JDK1.5中提供了多线程升级的解决方案。

1.将同步synchronized替换成现实Lock操作。

2.将Object中的wait,notify,notifyAll,替换为了Condition对象

3.该Condition对象可以对Lock锁进行获取。

4.使用Condition对象,能够实现本方只唤醒对方的操作(即只唤醒需要运行的线程,不用把所有的线程全部唤醒)不需要再使用                 notifyAll() 把所有的线程唤醒。
      
    5.Lock:替代了Synchronized
       Lock中的方法:
                              lock
                              unlock
                              newConditon()
    6.Condition:替代了 Object中的 wait() notify() notifyAll()
       Condition中的方法:

await();
                               signal();
                               signalAll();

2.改写原来用Synchronized的生产者消费者代码

/** *  */
package threadCommnication;  import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;  public class Resource {  String name;    private int count = 1;  /** * 标志位 * flag = false 表示没有资源了,要生产,消费者不能取 * flage = ture 表示有资源,不要生产,消费者可以取 */  private boolean flag = false;  //定义锁对象  private Lock lock = new ReentrantLock();  //对于生产者的锁  private Condition condition_Producer = lock.newCondition();  //对于消费者的锁  private Condition condition_consumer = lock.newCondition();  public  void set(String name) throws InterruptedException  {     lock.lock();  try{  while(flag){  //当有资源时,告诉生产者等待  condition_Producer.await();  }     this.name = name+"--"+count++;  System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);  flag = true;  //生产完后,通知消费者来取,唤醒消费者线程  condition_consumer.signal();  }finally{  //释放锁的动作一定要执行。  lock.unlock();  }  }  public  void out() throws InterruptedException{  lock.lock();  try{  while(flag == false){  //当没有资源时等待生产者生产  condition_consumer.wait();  }  //有资源,消费  System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);  flag = false;  //通知生产者来生产  condition_Producer.signal();  }finally{  lock.unlock();  }  }
}  

转载于:https://my.oschina.net/vshcxl/blog/796012

Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例相关推荐

  1. java多线程:线程间的通信-生产者和消费者(三)

    在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...

  2. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  3. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  4. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  5. Java多线程:线程间通信方式

    文章目录 Java线程通信 wait().notify().notifyAll() API说明 实现原理 代码实现 await().signal().signalAll() API说明 实现原理 代码 ...

  6. JAVA多线程之线程间的通信方式

    线程间的通信方式 1同步 2while轮询的方式 3waitnotify机制 4管道通信 线程间的通信方式 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通 ...

  7. java 线程间通信方式_「转」JAVA多线程之线程间的通信方式

    1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...

  8. Java多线程:线程间通信之volatile与sychronized

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...

  9. Java多线程之线程间协作 notify与wait的使用

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也 ...

最新文章

  1. jquery eval解析JSON中的注意点介绍
  2. Ubuntu 安装软件的三种方式
  3. 8 包含min函数的栈
  4. 密码学专题 证书和CA指令 申请证书|建立CA|CA操作|使用证书|验证证书
  5. 第五节:video标签的特性,你全都掌握了吗?
  6. 在deepin中安装docker
  7. AcWing321.棋盘分割(区间DP)题解
  8. YTU 3003: 括号匹配(栈和队列)
  9. Xampp PHPStorm XDebug配置
  10. js混淆还原工具_混淆过的js代码如何还原?
  11. 微信小程序 java后勤服务管理系统app
  12. Householder变换(反射变化)与Givens变换(旋转变化)的学习笔记
  13. ios模拟器装ipa包_给iOS 模拟器“安装”app文件
  14. 合并两个有序链表-c语言
  15. 实际应用3: 图书数据可视化分析(基于matplotlib的python数据可视化)
  16. Justinmind,为移动设计而生
  17. 对啊网初级会计2-1会计基础1
  18. HP笔记本HDMI检测不到外接显示器
  19. PHP是专为后端,后端开发PHP入门必备
  20. 什么是爱情——碧海青天BBS

热门文章

  1. LeetCode 7 反转整数
  2. (0096)iOS开发之应用间的分享系列(1)
  3. jieba(结巴)常用方法
  4. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
  5. 深入理解javascript的闭包
  6. PHP获取今天开始和结束的时间戳
  7. Remove Trovi Search from Apple Mac OS X
  8. 01背包 + 概率 之 hdu 2955
  9. java开发中遇到的问题及解决方法(持续更新)
  10. 最近实际项目中遇到的技术问题与解决思路