java多线程学习笔记(七) ——消费者与生产者(LOCK、Condition接口)
来源:互联网 发布:wpsoffice软件下载 编辑:程序博客网 时间:2024/05/16 12:21
生产者,消费者。
多生产者,多消费者的问题。
if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
while判断标记,解决了线程获取执行权后,是否要运行!
notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。
jdk1.5以后将同步和锁封装成了对象。
并将操作锁的隐式方式定义到了该对象中,
将隐式动作变成了显示动作。
Lock接口: 出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成现实锁操作。
同时更为灵活。可以一个锁上加上多组监视器。
lock():获取锁。
unlock():释放锁,通常需要定义finally代码块中。
多生产者,多消费者的问题。
if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
while判断标记,解决了线程获取执行权后,是否要运行!
notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。
notifyAll解决了本方线程一定会唤醒对方线程的问题。
class Resource{private String name;private int count = 1;private boolean flag = false;public synchronized void set(String name)// {while(flag)try{this.wait();}catch(InterruptedException e){}// t1 t0this.name = name + count;//烤鸭1 烤鸭2 烤鸭3count++;//2 3 4System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);//生产烤鸭1 生产烤鸭2 生产烤鸭3flag = true;notifyAll();}public synchronized void out()// t3{while(!flag)try{this.wait();}catch(InterruptedException e){}//t2 t3System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);//消费烤鸭1flag = false;notifyAll();}}class Producer implements Runnable{private Resource r;Producer(Resource r){this.r = r;}public void run(){while(true){r.set("烤鸭");}}}class Consumer implements Runnable{private Resource r;Consumer(Resource r){this.r = r;}public void run(){while(true){r.out();}}}class ProducerConsumerDemo{public static void main(String[] args) {Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t0 = new Thread(pro);Thread t1 = new Thread(pro);Thread t2 = new Thread(con);Thread t3 = new Thread(con);t0.start();t1.start();t2.start();t3.start();}}
jdk1.5以后将同步和锁封装成了对象。
并将操作锁的隐式方式定义到了该对象中,
将隐式动作变成了显示动作。
Lock接口: 出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成现实锁操作。
同时更为灵活。可以一个锁上加上多组监视器。
lock():获取锁。
unlock():释放锁,通常需要定义finally代码块中。
Condition接口:出现替代了Object中的wait notify notifyAll方法。
将这些监视器方法单独进行了封装,变成Condition监视器对象。
可以任意锁进行组合。
await();
signal();
signalAll();
import java.util.concurrent.locks.*;class Resource{private String name;private int count = 1;private boolean flag = false;//创建一个锁对象。Lock lock = new ReentrantLock();//通过已有的锁获取该锁上的监视器对象。//Condition con = lock.newCondition();//通过已有的锁获取两组监视器,一组监视生产者,一组监视消费者。Condition producer_con = lock.newCondition();Condition consumer_con = lock.newCondition();public void set(String name)// t0 t1{lock.lock();try{while(flag)//try{lock.wait();}catch(InterruptedException e){}// t1 t0try{producer_con.await();}catch(InterruptedException e){}// t1 t0this.name = name + count;//烤鸭1 烤鸭2 烤鸭3count++;//2 3 4System.out.println(Thread.currentThread().getName()+"...生产者5.0..."+this.name);//生产烤鸭1 生产烤鸭2 生产烤鸭3flag = true;//notifyAll();//con.signalAll();consumer_con.signal();}finally{lock.unlock();}}public void out()// t2 t3{lock.lock();try{while(!flag)//try{this.wait();}catch(InterruptedException e){}//t2 t3try{cousumer_con.await();}catch(InterruptedException e){}//t2 t3System.out.println(Thread.currentThread().getName()+"...消费者.5.0......."+this.name);//消费烤鸭1flag = false;//notifyAll();//con.signalAll();producer_con.signal();}finally{lock.unlock();}}}class Producer implements Runnable{private Resource r;Producer(Resource r){this.r = r;}public void run(){while(true){r.set("烤鸭");}}}class Consumer implements Runnable{private Resource r;Consumer(Resource r){this.r = r;}public void run(){while(true){r.out();}}}class ProducerConsumerDemo2{public static void main(String[] args) {Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t0 = new Thread(pro);Thread t1 = new Thread(pro);Thread t2 = new Thread(con);Thread t3 = new Thread(con);t0.start();t1.start();t2.start();t3.start();}}
0 0
- java多线程学习笔记(七) ——消费者与生产者(LOCK、Condition接口)
- java个人学习笔记19(多生产者多消费者+循环判断标记+notifyAll()+Lock+Condition)
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 多生产者多消费者问题(Lock接口、Condition接口)
- java多线程之多生产者与多消费者案例之Lock和Condition实现方式
- 【Java多线程】-Condition使用(生产者-消费者)
- 多生产者、多消费者问题及java新特性(Lock锁、Condition接口)
- 使用 Lock 与Condition 实现生产者消费者
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- Java SE学习笔记:线程通信、生产者与消费者案例、线程状态(线程的生命周期)、线程操作、Condition类
- java多线程Lock Condition生产消费者
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式(进一步优化,解决可能产生的死锁问题)
- Java基础-多线程-生产者与消费者(笔记)
- java多线程学习笔记——concurrent包的一些类(Lock 和Condition)
- java多线程-Lock与Condition接口的使用详解
- java多线程学习之生产者与消费者(二)
- linux多线程学习(七)——实现“生产者和消费者”
- Code Forces 586 B. Laurenty and Shop(水~)
- Lucene之——输出分词结果的核心代码
- 自动定量发表删除空间说说脚本代码
- c总结2 ---自己实现字符串的拷贝(指针学习1)
- Python 内建函数--map()
- java多线程学习笔记(七) ——消费者与生产者(LOCK、Condition接口)
- 小感悟
- 过渡性html
- databse学习资源
- 【图像处理】数字图像处理软件-特效--光晕特效(五)
- 黑马程序员--指向指针的指针 写的非常好 适合0基础菜鸟
- printf PRIu64
- uint8_t 头文件为#include<stdint.h>
- leedcode: Course Schedule