Java 生产者模式 消费者模式

1 // The standard idiom for calling the wait
2 synchronized(sharedObject) {
3        while(condition){
4             sharedObject.wait();// Releases lock, and reacquires on wake up
5        }
6        // do action based upon condition e.g. take or put into queue
7 }

使用wait和notify函数的规范代码模版。

在while循环里使用wait的目的:是在线程被唤醒前后都持续检查条件是否被满足,如果条件并未改变,wait被调用之前notify的唤醒通知就来了,那个这个线程并不能保证被唤醒,有坑会导致死锁的问题。

 1 public class ProducerConsumer {
 2       public static void main (String args[]) {
 3             Queue<Integer> buffer = new LinkedList<>();
 4             int maxSize = 10;
 5             Thread producer = new Producer(buffer, maxSize, "PRODUCER");
 6             Thread consumer = new Producer(buffer, maxSize, "CONSUMER");
 7             producer.start();
 8             consumer.start();
 9       }
10 }    

在上面代码中,声明了一个LinkedList作为缓冲区队列(在java中,LinkedList实现了队列的接口)。

class Producer extends Thread  {
      private Queue<Integer> queue;
      private int maxSize;
      public Producer(Queue<Integer> queue, int maxSize, String name) {
             super(name);
             this.queue = queue;
             this.maxSize = maxSize;
      }

      @Override
      public void run () {
           while (true) {
                 synchronized (queue) {  // 其它线程不能在我们检查条件时改变这个队列
                        while (queue.size() == maxSize) {
                              try {
                                    // Queue is full
                                    // Producer thread waiting for
                                    // consumer to take something from queue
                                    queue.wait();
                              } catch (Exception e) {
                                    e.printStackTrace();
                              }
                              Random random = new Random();
                              int producerValue = random.nextInt();
                              queue.add(producerValue);
                              queue.notifyAll();
                        }
                 }
           }
      }
}

如上代码为生产者,其在无限循环中持续往LinkedList里插入随机整数直到LinkedList满。如果队列满了,那么生产者线程会在消费者线程消耗掉队列里的任意一个整数,并用notify通知生产者线程之前持续等待。

 1 class Consumer extends Thread {
 2     private Queue<Integer> queue;
 3     private int maxSize;
 4     public Consumer (Queue<Integer> queue, int maxSize, String name ){
 5          super(name);
 6          this.queue = queue;
 7          this.maxSize= maxSize;
 8     }
 9     @Override
10     public void run() {
11           while (true) {
12                 synchronized (queue) {
13                       while (queue.isEmpty()) {
14                              // queue is empty;
15                              // Consumer thread is waiting
16                              // for producer thread to put something in queue
17                              try {
18                                    queue.wait();
19                              } catch (Exception e) {
20                                    e.printStackTrace();
21                              }
22                              print("Consumer value : " + queue remove());
23                              queue.notifyAll();
24                       }
25                 }
26           }
27     }
28 }

注意:

1. 你可以使用wait和notify函数来实现线程间通信,你可以用它们来实现多线程之间的通信。

2. 永远在synchronized的函数或者对象里使用wait、notify、notifyAll,不然java虚拟机会生成IllgalMonitorStateException。

3. 永远在while循环里而不是在if语句下使用wait,这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。

4. 永远在多线程间共享的对象(生产者消费者模型里即缓冲区队列)上使用wait。

Producer - Consumer Pattern:

Consumer:

sunchronized (obj) {
     while (!workToDo) {
           obj.wait();
     }
     // get next item from this queue
     workToDo = false;
}
// do work on the item

Producer:

1 synchronized (obj) {
2       if (!workToDo) {
3            // add work to queue
4            workToDo = true;
5       }
6       obj.notifyAll();
7 }
时间: 2024-11-14 04:41:41

Java 生产者模式 消费者模式的相关文章

Java多线程设计模式(2)生产者与消费者模式

1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不匹配. 当要从某个线程Produccer参与者将数据传输给其它线程Consumer参与者的时候,此时就可以在中间加一个Channel参与者,在Channel参与者中以某种方式存放接受的数据,再以某方式来获取收到的数据,Channel就可以来缓存两个线程之间传输的数据,在Channel参与者为了保证安

Java并发编程(4)--生产者与消费者模式介绍

一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就先消费直至消费完成:而生产者每天的工作就是先检测仓库是否有库存,如果没有就开始生产,满仓了就停止生产等待消费,直至工作结束.下图是根据假象画的流程图: 那么在程序中怎么才能达到这样的效果呢?下面介绍三种方式实现. 二.使用notify() 和 wait()实现 相信大家这两个方法都不陌生,它是Obj

同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 以前的代码格式就不再吐槽了(以后努力改进) //输出结果是一个无限循环 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多个生产者&多个消费者模式 * 多个生产者不断生产,多个消费者不停的消费

多线程生产者、消费者模式中,如何停止消费者?多生产者情况下对“毒丸”策略的应用。

生产者.消费者模式是多线程中的经典问题.通过中间的缓冲队列,使得生产者和消费者的速度可以相互调节. 对于比较常见的单生产者.多消费者的情况,主要有以下两种策略: 通过volatile boolean producerDone =false 来标示是否完成.生产者结束后标示为true, 消费者轮询这个变量来决定自己是否退出. 这种方式对producerDone产生比较大的争用,实现起来也有诸多问题需要考虑. 比较经典的"毒丸"策略,生产者结束后,把一个特别的对象:"毒丸&quo

Linux:生产者与消费者模式

生产者:生产数据 消费者:消费数据 提供场所:缓冲区,eg:超市 生产者消费者特点:三种关系,两类人,一个场所 三种关系指的是:生产者与生产者之间是互斥关系 消费者与消费者之间是互斥关系 生产者与消费者之间是同步与互斥关系 两类人:生产者,消费者 一个场所:存储数据(此处用带头单链表实现) 单生产者单消费者模式:此例取数据方式为FIFO先进先出. 利用互斥锁实现单生产者单消费者模式. #include<stdio.h> #include<malloc.h> #include<

生产者与消费者模式(线程的同步与互斥)

死锁产生的四个条件: 1.互斥使用(资源独占) 一个资源每次只能给一个进程使用 .2.不可强占(不可剥夺) 资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 .3.请求和保持(部分分配,占有申请) 一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) .4.循环等待 存在一个进程等待队列 {P1 , P2 , - , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,-,Pn等待P1占有的资源,形成一个进程等待环路 生产者:生产数据

python实现生产者和消费者模式

利用python的线程实现简单生产者和消费者模式,这种模式在多线程编程时还是用的比较多吧,下面是源代码: 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 import requests,time 4 import threading,queue 5 6 7 class mythread_1(threading.Thread): 8 def __init__(self,queue): 9 super(mythread_1,self).__init__

python 生产者与消费者模式

生产者与消费者模式 1. 队列 先进先出 2. 栈 先进后出 Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用.可以使用队列来实现线程间的同步. 用FIFO队列实现上述生产者与消费者问题的代码如下: import threading import time from q

实现生产者与消费者模式

实现生产者与消费者模式 目录 生产者与消费者模式 实现 生产者与消费者模式 什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力. 这个阻塞队列就是用来给生产者和消费者解耦的.纵观大多数设计模式,都会找一个第三者出来进行解耦,如工厂模式

java 生产者 与 消费者的案例

主要理解了两个问题 1.线程数据同步的问题 2.线程交替运行的方式 package ThreadDemo; /** * 生产者与消费者的案例(一,同步的问题,值的问题 二,交替执行的问题) * @author lile * 同步的问题(synchronized 知识点) * 交替执行的问题(notify ,wait, 线程等待) */public class ThreadDemo { public static void main(String[] args) { Food food = new