Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
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---生产者消费者为例相关推荐
- java多线程:线程间的通信-生产者和消费者(三)
在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式
一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
- Java多线程:线程间通信方式
文章目录 Java线程通信 wait().notify().notifyAll() API说明 实现原理 代码实现 await().signal().signalAll() API说明 实现原理 代码 ...
- JAVA多线程之线程间的通信方式
线程间的通信方式 1同步 2while轮询的方式 3waitnotify机制 4管道通信 线程间的通信方式 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通 ...
- java 线程间通信方式_「转」JAVA多线程之线程间的通信方式
1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...
- Java多线程:线程间通信之volatile与sychronized
由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...
- Java多线程之线程间协作 notify与wait的使用
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也 ...
最新文章
- jquery eval解析JSON中的注意点介绍
- Ubuntu 安装软件的三种方式
- 8 包含min函数的栈
- 密码学专题 证书和CA指令 申请证书|建立CA|CA操作|使用证书|验证证书
- 第五节:video标签的特性,你全都掌握了吗?
- 在deepin中安装docker
- AcWing321.棋盘分割(区间DP)题解
- YTU 3003: 括号匹配(栈和队列)
- Xampp PHPStorm XDebug配置
- js混淆还原工具_混淆过的js代码如何还原?
- 微信小程序 java后勤服务管理系统app
- Householder变换(反射变化)与Givens变换(旋转变化)的学习笔记
- ios模拟器装ipa包_给iOS 模拟器“安装”app文件
- 合并两个有序链表-c语言
- 实际应用3: 图书数据可视化分析(基于matplotlib的python数据可视化)
- Justinmind,为移动设计而生
- 对啊网初级会计2-1会计基础1
- HP笔记本HDMI检测不到外接显示器
- PHP是专为后端,后端开发PHP入门必备
- 什么是爱情——碧海青天BBS