Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
2015-12-13 16:37
811 查看
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();
}
}
}
相关文章推荐
- Java list的用法排序及遍历
- 2015年12月13日 spring初级知识讲解(四)面向切面的Spring
- java资源定位(非web项目)
- Struts2框架学习之五:通用标签详解
- gradle项目中如何支持java与scala混合使用?
- java IO读写文件
- 【算法拾遗(java描述)】--- 排序算法概述
- 设计模式——生成器模式
- eclipse 控制台乱码
- Java中ArrayList 元素的排序
- setContentView (Java)
- JAVA7 的ForkJoin框架-学习笔记
- eclipse安装和卸载插件
- java的io操作
- Java 的Hashtable和HashMap的区别
- Java API实现文件复制
- 深度分析Java的ClassLoader机制(源码级别)
- Java回炉之多线程(二)生产者与消费者
- java实现梯度下降算法
- BF算法(java版本)