多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式(进一步优化,解决可能产生的死锁问题)
来源:互联网 发布:普通电视怎么连接网络 编辑:程序博客网 时间:2024/04/30 10:03
package com.qianfeng.demo02 ;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 之前解决本方唤醒对方的问题是唤醒了线程池中全部线程。 * 缺点:这样做可以实现,但是效率比较低,而且还唤醒了本方。 * * 升级之后lock和condition就能解决这个问题。 * 之前是两个锁嵌套可能出现死锁的问题,现在的解决方案是只有一个锁,但是锁上面可以加入多个监视器。 * 一个用来监视生成者,一个用来监视消费者。 * * *///资源class Resource{private String name;private int count = 1;private boolean flag; //判断盘子里是否有馒头的标志位。//指定一把锁private Lock lock = new ReentrantLock();//获取锁的监视器private Condition pro_con = lock.newCondition(); //负责监视生产者private Condition cus_con = lock.newCondition(); //负责监视消费者public void set(String name){//获取锁lock.lock();try {while (flag) {try {pro_con.await();} catch (InterruptedException e) {e.printStackTrace();}}this.name = name+count;count++;System.out.println(Thread.currentThread().getName()+"....生产了..."+this.name);flag = true;cus_con.signal();} catch (Exception e) {e.printStackTrace();}finally {lock.unlock(); //释放锁}}public void get(){lock.lock();try {while (!flag) {try {cus_con.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(Thread.currentThread().getName()+"....消费了..."+this.name);flag = false;pro_con.signal();} catch (Exception e) {// TODO: handle exception}finally {lock.unlock();}}}//生产者class Produce implements Runnable{private Resource r;public Produce (Resource r) {this.r = r;}@Overridepublic void run() {while (true) {r.set("馒头");}}}//消费者class Customer implements Runnable{private Resource r;public Customer (Resource r) {this.r = r;}@Overridepublic void run() {while (true) {r.get();}}}public class LockDemo02 {public static void main(String[] args) {Resource r = new Resource ();Produce p = new Produce (r);Customer c = new Customer (r);Thread t0 = new Thread(p);Thread t1 = new Thread(p);Thread t = new Thread(c);Thread t3 = new Thread(c);t0.start();t1.start();t .start();t3.start();}}
0 0
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式(进一步优化,解决可能产生的死锁问题)
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- java多线程学习笔记(七) ——消费者与生产者(LOCK、Condition接口)
- 多生产者多消费者问题(Lock接口、Condition接口)
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- Java 多线程编程(生产者和消费者问题以及死锁)
- 生产者消费者模式(解决多线程容易死锁的一个方案)
- 多线程——等待唤醒机制经典实例:生产者消费者模式(优化)
- 多生产者、多消费者问题及java新特性(Lock锁、Condition接口)
- 【Java多线程】-Condition使用(生产者-消费者)
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- Java 多线程 (PART XVIII) Lock(II)用lock实现生产者消费者模式
- Java多线程解决生产者和消费者问题(面向对象)
- 多线程下,生产者消费者锁的优化问题
- 生产者消费者模型(使用lock.condition进行分组唤醒)
- Java并行编程-lock中使用多条件condition(生产者消费者模式实例)
- Maven官方指南
- Vmware12下基于CentOS 7.0安装LAMP
- C++拷贝构造函数详解
- c语言中sizeof struct和sizeof union
- Codeforces Round #366 (Div. 2)B
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式(进一步优化,解决可能产生的死锁问题)
- C实现的类似vector的容器
- POJ 1067 HDU 1527 取石子游戏(威佐夫博奕)
- hdu 1283
- 自定义UICollectionView布局
- ionic开发环境示例
- Android开发之浅谈java虚拟机和Dalvik虚拟机的区别
- Java编程简单的倒计时器
- 后台查询的数据传到前台为数据为空!导流程提交报空指针错误!