java中的生产者和消费者的问题
1----使用Java.util.concurrent.locks包中的lock接口取代synchronized,通过ReentrantLock这个已经实现Lock接口的类,
创建ReentrantLock对象lock(private final ReentrantLock lock = new ReentrantLock(); ) ,并通过使用这个对象中的lock()方法让线程获得锁(lock.lock(););
使用unlock();在退出代码块块时释放锁(lock.unlock();),
2----其中while(flag)解决了if(flag)存在的重复生产,使得消费者丢失对其中被覆盖的数据(烧鸡)的读取.但是while会导致死锁,会出现全部线程都被休眠的情况,此时可以将notify ()修改为notifyAll()使得程序被全部唤醒,间接实现相互唤醒,但是由于对同类线程的唤醒时没有意义的,此时,程序的效率降低.
3---解决上一个问题的方法为:使用Java.util.concurrent.locks中的Condition接口,通过对同一个锁创建不同的Condition实例,并使用不同实例调用其各自的await()和signal()方法实现对t0 t1和t2 t3这2组线程的冻结和唤醒管理.从而不再需要每次都全部唤醒造成的效率降低的问题.
/*
需求:生产者---->消费者
资源:烤鸭一只
每生产一只,就消费一zhi
*/
import java.util.concurrent.locks.*;
class Resource
{
private String name;
private int count=0;
private boolean flag=false;
private final ReentrantLock lock = new ReentrantLock();
final Condition cond1 = lock.newCondition();
final Condition cond2 = lock.newCondition();
public void make(String name)
{
lock.lock();
while(flag)
try
{
cond1.await();
}
catch (InterruptedException e)
{
} this.name = name;
count++;
flag=true;
cond2.signal();
System.out.println(Thread.currentThread().getName()+"生产者..."+name+count);
lock.unlock();
}
public void out()
{
lock.lock();
while(!flag)
try
{
cond2.await();
}
catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName()+"消费者......."+count);
flag = false;
cond1.signal();
lock.unlock();
} }
class Producer implements Runnable
{
Resource r = new Resource();
Producer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
r.make("烤鸭");
}
}
class Customer implements Runnable
{
Resource r = new Resource();
Customer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
r.out();
}
}
class ProducerCustomer
{
public static void main(String[] args)
{
//建立资源类
Resource r = new Resource();
//建立任务对象
Producer pro = new Producer(r);
Customer cus = new Customer(r);
//建立线程
Thread t0 = new Thread(pro);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(cus);
Thread t3 = new Thread(cus);
//开启线程
t0.start();
t1.start();
t2.start();
t3.start(); }
}
java中的生产者和消费者的问题的更多相关文章
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...
- Java中的生产者和消费者实例(多线程 等待唤醒机制)
1.什么是等待唤醒 我们实现的效果 创建生产者和消费者 对服装进行生产 和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
- 0032ActiveMQ之java编码实现生产者和消费者操作队列queue
今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下: maven工程的搭建此处不再讲解,在maven工程 ...
- Java 实践:生产者与消费者
实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...
- java学习之生产者和消费者案例
package com.gh.thread; /** * 生产者和消费者案例 * wait和sleep的区别 * wait不让出监视器锁,sleep让出监视器的锁 * @author ganhang ...
- Linux内核中实现生产者与消费者(避免无效唤醒)【转】
转自:http://blog.csdn.net/crazycoder8848/article/details/42581399 本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计 ...
- java多线程中的生产者与消费者之等待唤醒机制@Version2.0
二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版 ...
- RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例
pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...
随机推荐
- [Angular2 Router] Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept
In this tutorial we are going to learn how to configure the Angular 2 router to cover some commonly ...
- 三星galaxy s4问题解决及快捷操作
http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...
- Linq lamda表达式Single和First方法
让我们来看看如何对一个整数数组使用 Single 操作符.这个整数数组的每个元素代表 2 的 1 到 10 次方.先创建此数组,然后使用 Single 操作符来检索满足 Linq Lambda表达 ...
- php与mysql通讯那点事
php与mysql通讯那点事 http://www.cnxct.com/libmysql-mysqlnd-which-is-best-and-what-about-mysqli-pdomysql-my ...
- 基于Linux的集群系统(八)--转
引用位置:http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part8/index.html OSI参考模型及TCP/I ...
- 让ConfigurationManager打开任意的配置文件
VisualStudio的配置文件很好很强大,用来保存数据库连接字符串或键值对都非常方便,只需要通过ConfigurationManager的ConnectionStrings或AppSettings ...
- double数值多时系统默认科学计数法解决方法
比如 Double d = new Double("1234567890.12"); System.out.println("d:="+d); java.tex ...
- python使用rrdtool时 argument 0 must be string的问题
在updatev rrdfile时, ret = rrdtool.updatev(filename, ds) 报了argument 0 must be string的异常,经查是因为python 的r ...
- maven安装仓库中不存在的jar包
这里以ojdbc6.jar作为案例 首先我的ojdbc6.jar放在D盘的根目录D:\ojdbc6.jar 然后我们打开cmd命令窗口,运行命令:mvn install:install-file -D ...
- StdRandom.java
/************************************************************************* * Compilation: javac StdR ...