1. //生产者
    package com.mzj.test;
  2. import java.util.Vector;
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5.  
  6. public class Producer implements Runnable {
  7.  
  8. private final Vector sharedQueue;
  9. private final int SIZE;
  10.  
  11. public Producer(Vector sharedQueue, int size) {
  12. this.sharedQueue = sharedQueue;
  13. this.SIZE = size;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. // TODO Auto-generated method stub
  19. for (int i = 0; i < 7; i++) {
  20. System.out.println("Produced:" + i);
  21. try {
  22. produce(i);
  23. } catch (InterruptedException ex) {
  24. Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
  25. }
  26. }
  27. }
  28.  
  29. private void produce(int i) throws InterruptedException {
  30.  
  31. //wait if queue is full
  32. while (sharedQueue.size() == SIZE) {
  33. synchronized (sharedQueue) {
  34. System.out.println("Queue is full " + Thread.currentThread().getName()
  35. + " is waiting , size: " + sharedQueue.size());
  36. sharedQueue.wait();
  37. }
  38. }
  39.  
  40. //producing element and notify consumers
  41. synchronized (sharedQueue) {
  42. sharedQueue.add(i);
  43. sharedQueue.notifyAll();
  44. }
  45. }
  46. }

消费者

  1. package com.mzj.test;
  2. import java.util.Vector;
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5.  
  6. public class Consumer implements Runnable {
  7.  
  8. private final Vector sharedQueue;
  9. private final int SIZE;
  10.  
  11. public Consumer(Vector sharedQueue, int size) {
  12. this.sharedQueue = sharedQueue;
  13. this.SIZE = size;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. // TODO Auto-generated method stub
  19. while (true) {
  20. try {
  21. System.out.println("Consumer: " + consume());
  22. Thread.sleep(50);
  23. } catch (InterruptedException ex) {
  24. Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
  25. }
  26. }
  27. }
  28.  
  29. private int consume() throws InterruptedException {
  30.  
  31. //wait if queue is empty
  32. while (sharedQueue.isEmpty()) {
  33. synchronized (sharedQueue) {
  34. System.out.println("Queue is empty " + Thread.currentThread().getName()
  35. + " is waiting , size: " + sharedQueue.size());
  36. sharedQueue.wait();
  37. }
  38. }
  39.  
  40. //otherwise consume element and notify waiting producer
  41. synchronized (sharedQueue) {
  42. sharedQueue.notifyAll();
  43. return (Integer) sharedQueue.remove(0);
  44. }
  45. }
  46. }

测试

  1. package com.mzj.test;
  2. import java.util.Vector;
  3.  
  4. public class ProducerConsumerSolution {
  5.  
  6. public static void main(String[] args) {
  7. Vector sharedQueue = new Vector();
  8. int size = 4;
  9. Thread prodThread = new Thread(new Producer(sharedQueue, size), "Producer");
  10. Thread consThread = new Thread(new Consumer(sharedQueue, size), "Consumer");
  11. prodThread.start();
  12. consThread.start();
  13. }
  14. }

用 wait-notify 解决生产者-消费者问题的更多相关文章

  1. java多线程15 :wait()和notify() 的生产者/消费者模式

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  2. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  3. Java如何使用线程解决生产者消费者问题?

    在Java编程中,如何使用线程解决生产者消费者问题? 以下示例演示如何使用线程解决生产者消费者问题. package com.yiibai; public class ProducerConsumer ...

  4. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  5. java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  6. java使用synchronized与Semaphore解决生产者消费者问题对比

    一.synchronized与信号量Semaphore简介 1.synchronized是java中的关键字,是用来控制线程同步的问题最常用的方法. 2.Semaphore是属于java的一个类,同样 ...

  7. 多线程-4.wait() notify() notifyAll() 生产者消费者模型

    1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...

  8. 基于java callable及future接口解决生产者消费者问题

    这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者- ...

  9. Java 管程解决生产者消费者问题

    同样是实验存档.//.. 依然以生产者消费者问题作为背景. 管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就 ok,不用去考虑进程同步的问题. 管程: packag ...

  10. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

随机推荐

  1. Jquery ajax动态更新下拉列表的内容

    $("#book_id").change(function(){ $book_id=$(this).children('option:selected').val(); //ale ...

  2. MYSQL连接相关参数和状态值详解

    针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...

  3. centOS 7 简单设置(虚拟机)

    1.修改主机名 hostnamectl set-hostname 2.ssh连接慢的问题解决 vim /etc/ssh/sshd_config UseDNS=no GSSAPIAuthenticati ...

  4. C#中的多线程 - 高级多线程 z

    原文:http://www.albahari.com/threading/part4.aspx 专题:C#中的多线程 1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也 ...

  5. Yii2用Gii自动生成Module+Model+CRUD

    1. 开启gii模块 common/config/main-local.php加入下面代码 return [ 'modules' => [ 'gii' => [ 'class' => ...

  6. 全链路实践Spring Cloud 微服务架构

    Spring Cloud 微服务架构全链路实践Spring Cloud 微服务架构全链路实践 阅读目录: 网关请求流程 Eureka 服务治理 Config 配置中心 Hystrix 监控 服务调用链 ...

  7. background-color和background-image相关细节

    1.background-color 是以border-box作为他的左上角来定位的 2.background-image 默认是以padding-box作为他的左上角来定位的 3.backgroun ...

  8. Angular4.0--创建类实例

    src/app/hero.ts文件: export class Hero { constructor( public id: number, public name: string) { } } sr ...

  9. 理解Underscore的设计架构

    在一个多月的毕业设计之后,我再次开始了Underscore的源码阅读学习,断断续续也写了好些篇文章了,基本把一些比较重要的或者个人认为有营养的函数都解读了一遍,所以现在学习一下Underscore的整 ...

  10. MySQL语法三:数据控制语句

    数据控制语句MCL(GRANT,REVOKE,COMMIT,ROLLBACK)