JAVA——利用wait和notify实现生产者和消费者

经典的消费者和生产者的的实现:

注意事项:

  1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件:

  2:公用的缓冲池要用锁机制:

 1 package demo;
 2
 3 import java.util.Vector;
 4
 5 public class Main {
 6
 7     public static void main(String[] args) {
 8         Vector<Integer> pool=new Vector<Integer>();
 9         Producer producer=new Producer(pool, 4);
10         Consumer consumer=new Consumer(pool);
11         new Thread(producer).start();
12         new Thread(consumer).start();
13     }
14
15 }
16
17 //生产者
18 class Producer implements Runnable{
19     private Vector pool;
20     private Integer size;
21
22     public Producer(Vector pool, Integer size) {
23         this.pool = pool;
24         this.size = size;
25     }
26     @Override
27     public void run() {
28         for(int i=0;i<7;i++){
29             try {
30                 System.out.println("produce "+i);
31                 produce(i);
32             } catch (InterruptedException e) {
33                 // TODO Auto-generated catch block
34                 e.printStackTrace();
35             }
36         }
37     }
38     private void produce(int i) throws InterruptedException{
39         while(pool.size()==size){
40             synchronized (pool) {
41                 System.out.println("pool is full Producer is waiting,size is "+pool.size());
42                 pool.wait();
43             }
44         }
45         synchronized (pool) {
46             pool.add(i);
47             pool.notifyAll();
48         }
49     }
50 }
51
52
53 //消费者
54 class Consumer implements Runnable{
55     private Vector pool;
56     public Consumer(Vector pool) {
57         this.pool = pool;
58     }
59
60     @Override
61     public void run() {
62         for(int i=0;i<7;i++){
63             try {
64                 System.out.println("consume "+i);
65                 consume();
66             } catch (InterruptedException e) {
67                 // TODO Auto-generated catch block
68                 e.printStackTrace();
69             }
70         }
71     }
72
73     private void consume() throws InterruptedException{
74         while(pool.isEmpty()){
75             synchronized (pool) {
76                 System.out.println("pool is empty Consumer is waiting,size is "+pool.size());
77                 pool.wait();
78             }
79         }
80         synchronized (pool) {
81             pool.notifyAll();
82             pool.remove(0);
83
84         }
85     }
86 }

执行结果是:

时间: 2024-07-30 20:25:29

JAVA——利用wait和notify实现生产者和消费者的相关文章

Android(java)学习笔记71:生产者和消费者之等待唤醒机制

首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 下面我们就要重点介绍这个等待唤醒机制: 第一步:还是先通过代码体现出等待唤醒机制 package cn.itcast_05; /* * 分析: * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * * 问题1:按照思路写代码,发现数据每次都是:null---0 * 原因:我们在每个线程中都创建了

在程序中利用信号量同步来模拟生产者与消费者

信号量同步的概念: 一组并发进程进行相互合作.相互等待,使得各进程按一定的顺序执行的过程称为进程间的同步. customer.c product.c 运行生产者 运行消费者:

Java多线程虚假唤醒问题(生产者和消费者关系)

何为虚假唤醒: 当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功:比如买货:如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁: 避免虚假唤醒: 避免虚假唤醒的示例:这里使用了 Lambda 表达式 package com.jia.pc; public class A { public static void main(String[] args) { Data data = new

Linux:生产者与消费者模式

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

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

什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: 1.生产者生产的时候消费者不能消费 2.消费者消费的时候生产者不能生产 3.缓冲区空时消费者不能消费 4.缓冲区满时生产者不能生产 生产者/模型作为一种重要的模型,它的优点在于: 1.解耦.因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这一点很容易想到,这样生产者和消费者的代码发生变化,

Java多线程之~~~~使用wait和notify实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满 的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就 涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候 让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作,下面我们用实际的代码来展示如何使用wait和 notify来实现生产者消费者这个经典的模型. 首先是

java——利用生产者消费者模式思想实现简易版handler机制

参考教程:http://www.sohu.com/a/237792762_659256 首先介绍每一个类: 1.Message: 这个类的作用是存储一个生产者生产出来的具体的消息,就类似链表队列中的一个节点,自行定义需要存储的内容. code:消息要执行的具体动作代码 msg:消息内容 target:用来关联hadler,根本目的时为了使这几个类共享一个MessageQueue,这个很重要 2.MessageQueue: 这个类就是生产者和消费者线程需要共享的一个存储消息的队列,生产者将消息放入

JAVA学习第二十六课(多线程(六))- 多生产者多消费者问题

多生产者多消费者问题 以生产馒头 消费馒头为例. class Resource { private String name; private int count = 1; private boolean flag = false; public synchronized void set(String name) { if (flag) { try { this.wait(); } catch (Exception e) { // TODO: handle exception } } this.

java多线程中的生产者与消费者之等待唤醒机制@Version2.0

二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版的代码中: 把student的成员变量给私有化了, 把设置和获取的功能给封装成了功能,并加了同步, 设置或者获取的线程里面只需要调用方法即可. 1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所