java多线程之生产者与消费者模型2
在java5中加入了并发包,里面有很多有关并发相关的工具类,其中Lock 就是实现提供比使用synchronized方法和代码块获得更加广泛的锁定操作。这样会有更加灵活的结构,可以具有差别很大的属性,可以支持多个Condition对象。那么什么是Condition是什么呢?Condition是将Object监视器方法 wait、notify、notifyAll 分解成截然不同的对象,以便通过这些对象与Lock实现组合使用。那我们可以看出 Lock 代替了 synchronized 方法和代码块的使用,Condition代替了Object监视器方法的使用。在使用Condition的实例的时候会被绑定到一个锁上 ,所有我们要为特定的Lock获取Condition实例,我们使用Lock.newCondition 方法获取Condition。Condition的方法 await 造成当前线程在接到singal 或者singnalAll方法唤醒之前或一直处于等待状态。
在大多数我们使用锁的时候应该使用一下格式:
Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }
具体使用方法请看案例:
package java5.lock; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockTest { private static Lock lock = new ReentrantLock(); private static Condition isFullCondition = lock.newCondition(); private static Condition isEmptyCondition = lock.newCondition(); private static Queue<Apple> queue = new LinkedBlockingQueue<LockTest.Apple>(); private static class Apple { private String name; public Apple(String name) { super(); this.name = name; } @Override public String toString() { return "Apple [name=" + name + "]"; } } /** * 消费者 * @author gaoyuandong * @date 2015年7月24日 下午10:14:44 * @mail 466862016@qq.com */ private static class Customer extends Thread { @Override public void run() { while (true) { lock.lock(); try { if (queue.size() <=0) { System.err.println(Thread.currentThread().getName() +" 我饿,没有东西吃了,我等待..."); isEmptyCondition.await(); } queue.poll(); System.err.println( Thread.currentThread().getName() +" 我吃了一个苹果 还剩下" +queue.size() +"个苹果"); isFullCondition.signalAll(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ lock.unlock(); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 生产者 * @author gaoyuandong * @date 2015年7月24日 下午10:13:53 * @mail 466862016@qq.com */ private static class Producer extends Thread { @Override public void run() { while (true) { lock.lock(); try { if(queue.size() >= 30) { System.err.println(Thread.currentThread().getName() +" 我是生产者,我生产够了苹果。我要等待...."); isFullCondition.await(); } queue.add(new Apple("xx")); System.err.println(Thread.currentThread().getName() +" 我是生产者,我新生产一个苹果 现在共有" + queue.size() +"个苹果"); isEmptyCondition.signalAll(); } catch (Exception e) { // TODO: handle exception }finally { lock.unlock(); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void main(String[] args) { Producer producer = new Producer(); producer.start(); for (int i = 0; i < 10; i++) { Customer customer = new Customer(); customer.start(); } } }
输出结果:
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-2 我吃了一个苹果 还剩下0个苹果 Thread-3 我饿,没有东西吃了,我等待... Thread-1 我饿,没有东西吃了,我等待... Thread-4 我饿,没有东西吃了,我等待... Thread-6 我饿,没有东西吃了,我等待... Thread-5 我饿,没有东西吃了,我等待... Thread-7 我饿,没有东西吃了,我等待... Thread-8 我饿,没有东西吃了,我等待... Thread-9 我饿,没有东西吃了,我等待... Thread-10 我饿,没有东西吃了,我等待... Thread-2 我饿,没有东西吃了,我等待... Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-3 我吃了一个苹果 还剩下0个苹果 Thread-1 我吃了一个苹果 还剩下0个苹果 Thread-4 我吃了一个苹果 还剩下0个苹果 Thread-6 我吃了一个苹果 还剩下0个苹果 Thread-5 我吃了一个苹果 还剩下0个苹果 Thread-7 我吃了一个苹果 还剩下0个苹果 Thread-8 我吃了一个苹果 还剩下0个苹果 Thread-9 我吃了一个苹果 还剩下0个苹果 Thread-10 我吃了一个苹果 还剩下0个苹果 Thread-2 我吃了一个苹果 还剩下0个苹果 Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-9 我吃了一个苹果 还剩下0个苹果 Thread-6 我饿,没有东西吃了,我等待... Thread-7 我饿,没有东西吃了,我等待... Thread-2 我饿,没有东西吃了,我等待... Thread-3 我饿,没有东西吃了,我等待... Thread-10 我饿,没有东西吃了,我等待... Thread-1 我饿,没有东西吃了,我等待... Thread-4 我饿,没有东西吃了,我等待... Thread-5 我饿,没有东西吃了,我等待... Thread-8 我饿,没有东西吃了,我等待... Thread-9 我饿,没有东西吃了,我等待... Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-6 我吃了一个苹果 还剩下0个苹果 Thread-7 我吃了一个苹果 还剩下0个苹果 Thread-2 我吃了一个苹果 还剩下0个苹果 Thread-3 我吃了一个苹果 还剩下0个苹果 Thread-10 我吃了一个苹果 还剩下0个苹果 Thread-1 我吃了一个苹果 还剩下0个苹果 Thread-4 我吃了一个苹果 还剩下0个苹果 Thread-5 我吃了一个苹果 还剩下0个苹果 Thread-8 我吃了一个苹果 还剩下0个苹果 Thread-9 我吃了一个苹果 还剩下0个苹果 Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-9 我吃了一个苹果 还剩下0个苹果 Thread-7 我饿,没有东西吃了,我等待... Thread-3 我饿,没有东西吃了,我等待... Thread-6 我饿,没有东西吃了,我等待... Thread-2 我饿,没有东西吃了,我等待... Thread-10 我饿,没有东西吃了,我等待... Thread-5 我饿,没有东西吃了,我等待... Thread-1 我饿,没有东西吃了,我等待... Thread-4 我饿,没有东西吃了,我等待... Thread-8 我饿,没有东西吃了,我等待... Thread-9 我饿,没有东西吃了,我等待... Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-7 我吃了一个苹果 还剩下0个苹果 Thread-3 我吃了一个苹果 还剩下0个苹果 Thread-6 我吃了一个苹果 还剩下0个苹果 Thread-2 我吃了一个苹果 还剩下0个苹果 Thread-10 我吃了一个苹果 还剩下0个苹果 Thread-5 我吃了一个苹果 还剩下0个苹果 Thread-1 我吃了一个苹果 还剩下0个苹果 Thread-4 我吃了一个苹果 还剩下0个苹果 Thread-8 我吃了一个苹果 还剩下0个苹果 Thread-9 我吃了一个苹果 还剩下0个苹果 Thread-5 我饿,没有东西吃了,我等待... Thread-1 我饿,没有东西吃了,我等待... Thread-4 我饿,没有东西吃了,我等待... Thread-8 我饿,没有东西吃了,我等待... Thread-7 我饿,没有东西吃了,我等待... Thread-3 我饿,没有东西吃了,我等待... Thread-6 我饿,没有东西吃了,我等待... Thread-2 我饿,没有东西吃了,我等待... Thread-10 我饿,没有东西吃了,我等待... Thread-9 我饿,没有东西吃了,我等待... Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-5 我吃了一个苹果 还剩下0个苹果 Thread-1 我吃了一个苹果 还剩下0个苹果 Thread-4 我吃了一个苹果 还剩下0个苹果 Thread-8 我吃了一个苹果 还剩下0个苹果 Thread-7 我吃了一个苹果 还剩下0个苹果 Thread-3 我吃了一个苹果 还剩下0个苹果 Thread-6 我吃了一个苹果 还剩下0个苹果 Thread-2 我吃了一个苹果 还剩下0个苹果 Thread-10 我吃了一个苹果 还剩下0个苹果 Thread-9 我吃了一个苹果 还剩下0个苹果 Thread-7 我饿,没有东西吃了,我等待... Thread-5 我饿,没有东西吃了,我等待... Thread-4 我饿,没有东西吃了,我等待... Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果 Thread-1 我吃了一个苹果 还剩下0个苹果 Thread-8 我饿,没有东西吃了,我等待... Thread-9 我饿,没有东西吃了,我等待... Thread-6 我饿,没有东西吃了,我等待... Thread-10 我饿,没有东西吃了,我等待... Thread-3 我饿,没有东西吃了,我等待... Thread-2 我饿,没有东西吃了,我等待... Thread-7 我吃了一个苹果 还剩下0个苹果 Thread-5 我吃了一个苹果 还剩下0个苹果 Thread-4 我吃了一个苹果 还剩下0个苹果
相关推荐
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
java多线程_消费者与生产者模型
java 多线程生产者消费者模型demo
基本满足操作系统课上要求,java实现的生产者消费者模型。
所谓的生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题。通俗的讲,就是生产者在不断的生产,消费者也在不断的消费,可是消费者消费的产品是生产者生产的,这就必然存在一个中间容器,我们可以把...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
利用线程间的通信主要是因为当多个线程同时对一个对象进行访问的时候,多个线程之间是一个协助的关系,举个例子就是今天要说的生产这和消费者模型。
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释...Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58
3)多个生产者或多个消费者之间须有共享的对缓冲区进行操作的函数代码。4) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态。提示:(1) 有界缓冲区可用数组实现。代码有详细...
主要介绍了Java多线程 生产者消费者模型实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java多线程 BlockingQueue实现生产者消费者模型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://ruyi574812039.iteye.com/blog/2097988
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。...它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
如果对什么是线程、什么...说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。
消息分发框架,基于java阻塞队列实现,生产者消费者模型 可用于任务分发,服务器消息消息,以及网络IO 性能优化,多线程
java多线程基础生产者消费者模型,自己用xmind做的思维导图,帮助小白快速熟悉多线程的操作。