700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java 多线程(三)线程间的通信jdk1.5中Lock Condition---生产者消费者为例

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

时间:2023-03-28 00:01:48

相关推荐

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。