您的位置:首页 > 编程语言 > Java开发

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();
}

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: