`

<找工作 十>生产者 消费者模型

    博客分类:
  • java
 
阅读更多

 今天被问了个这个问题,脑子当时给抽筋了,完全给木掉了,回来好好写了边,怎么会当时写不出来呢。。。

 

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test421 extends Thread {
	public void run() {
		Customer a = new Customer();
		a.start();
		Producer b = new Producer();
		b.start();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test421 c = new Test421();
		c.start();
	}

	int key = 0;
	Lock lock = new ReentrantLock();
	Condition condempty = lock.newCondition();
	Condition condfull = lock.newCondition();

	class Customer extends Thread {
		public void run() {
			while (true) {

				lock.lock();

				try {
					while (key < 1) {
						// System.out.println("await");
						condempty.await();
						// System.out.println("start");
					}
					System.out.println("消费了" + key);
					key--;
					condfull.signalAll();
					lock.unlock();

					// return ;
					Thread.sleep(12);

				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	class Producer extends Thread {
		public void run() {
			while (true) {
				try {
					// Thread.sleep(50);
					lock.lock();
					while (key >= 1000) {
						condfull.await();
					}

					// a++;
					key++;
					System.out.println("生产了" + key);

					// Thread.sleep(5000);
					condempty.signalAll();
					lock.unlock();

					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
 

锁和条件这种方式比较重要的一点要注意的是:就算condition.sigalAll();别的线程也一定要等到lock的释放才可以继续下去,换句话说,await的时候很重要的一点是他会阻塞掉,并且隐含的会释放掉锁,这很关键,只有这样别的线程才能获得锁,才能继续执行下去。

而  sigalAll  的时候并不执行释放锁操作,只有显示的调用lock.unlock后,锁才被释放。

分享到:
评论

相关推荐

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    LINGO软件的学习

    对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模...

    网上书店系统源码

    电子商务重新定义了传统的流通模式,减少了中间环节,使得生产者和消费者的直接交易成为可 能,从而在一定程度上改变了整个社会经济运行的方式。 电子商务一方面破除了时空的壁垒,另一方面又提供了丰富的信息资源...

    Java并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    Java 并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    JAVA面试题最全集

    12.synchronized (生产者和消费) 13.String 和 StringBuffer 14.Serializable 15.MVC (Struts的工作流程) 16.什么是MDA 17.tcp与udp的区别 18.链表与散列表和数组的区别 19.堆和栈的区别 20.ejb的分类及...

    高级软件架构师复习提纲

    Services与它们的消费者之间共享的是Schema和Contract ;以适用为目的的设计 14、以下哪些是功能规格说明书的组成元素?远景/范围总结;背景信息;设计目标;使用场景;功能和服务的描述;组件规格说明(产品和配置...

    C#23种设计模式_示例源代码及PDF

    消费者任何时候需要某种产品,只需向工厂请求即可。消 工厂模式 费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如 何创建及如何向客户端提供。 2、BUILDER — MM 最爱听的就是...

    c语言编写单片机技巧

    有能力的话,可以找一些相关兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到...

Global site tag (gtag.js) - Google Analytics