模拟生产者消费者(多条生产线多个消费者)

 1 import java.util.concurrent.ArrayBlockingQueue;
 2 import java.util.concurrent.BlockingQueue;
 3 import java.util.concurrent.locks.Lock;
 4 import java.util.concurrent.locks.ReentrantLock;
 5 /**
 6  * 模拟生产者消费者(多条生产线多个消费者)
 7  * 仓库容量为10
 8  * 保证仓库充足量为5
 9  * @author trfizeng
10  *
11  */
12 public class ProcudectConcusrm {
13     public static int id = 0;
14     public static void main(String[] args) {
15         BlockingQueue<String> bQ = new ArrayBlockingQueue<String>(10);
16         Lock lockP = new ReentrantLock();
17         Lock lockC = new ReentrantLock();
18         for (int i = 0; i < 10; i++) {
19             new Thread(new Producer(bQ,lockP)).start();
20             new Thread(new Consumer(bQ,lockC)).start();
21         }
22     }
23
24     public static class Producer implements Runnable{
25         BlockingQueue<String> bQ;
26         Lock lock;
27         public Producer(BlockingQueue<String> bQ,Lock lock) {
28             this.bQ = bQ;
29             this.lock = lock;
30         }
31         public void run() {
32             while (true) {
33                 try {
34                     String p = "产品" + ++id;
35                     lock.lock();
36                     if (5 >= bQ.size()) {
37                         bQ.put(p);
38                         System.out.println("放入产品:"+ p + ",当前库存:" + bQ.size());
39                         Thread.sleep(1500);
40                     }
41                 } catch (InterruptedException e) {
42                     e.printStackTrace();
43                 }finally{
44                     lock.unlock();
45                 }
46             }
47         }
48     }
49
50     public static class Consumer implements Runnable{
51         BlockingQueue<String> bQ;
52         Lock lock;
53         public Consumer(BlockingQueue<String> bQ,Lock lock) {
54             this.bQ = bQ;
55             this.lock = lock;
56         }
57         public void run() {
58             while (true) {
59                 try {
60                     lock.lock();
61                     if (5 < bQ.size()) {
62                         System.out.println("取出产品:" + bQ.take() + ", 当前库存:" + bQ.size());
63                         Thread.sleep(1500);
64                     }
65                 } catch (InterruptedException e) {
66                     e.printStackTrace();
67                 }finally{
68                     lock.unlock();
69                 }
70             }
71         }
72     }
73 }

print:

放入产品:产品1,当前库存:1
放入产品:产品2,当前库存:2
放入产品:产品3,当前库存:3
放入产品:产品4,当前库存:4
放入产品:产品5,当前库存:5
放入产品:产品6,当前库存:6
取出产品:产品1, 当前库存:5
放入产品:产品16,当前库存:6
取出产品:产品2, 当前库存:5
放入产品:产品17,当前库存:6
取出产品:产品3, 当前库存:5
放入产品:产品7,当前库存:6
取出产品:产品4, 当前库存:5
取出产品:产品5, 当前库存:5
放入产品:产品8,当前库存:5
放入产品:产品20,当前库存:6
取出产品:产品6, 当前库存:5
放入产品:产品21,当前库存:6
取出产品:产品16, 当前库存:5
放入产品:产品22,当前库存:6
取出产品:产品17, 当前库存:5
放入产品:产品23,当前库存:6
取出产品:产品7, 当前库存:5
放入产品:产品9,当前库存:6
取出产品:产品8, 当前库存:5

时间: 2024-10-24 10:19:48

模拟生产者消费者(多条生产线多个消费者)的相关文章

rabbitmq的安装和命令介绍及python程序模拟生产者和消费者

[介绍] RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发 RabbitMQ是AMQP(高级消息队列协议)的标准实现 官网:http://www.rabbitmq.com/ [安装] 方式:yum/rpm 系统环境 [[email protected]_server scripts]# ifconfig | sed -n 's#.*inet addr:

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库 //批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产者不停的生产产品并放入数量有限的指定槽内,而消费者从指定槽依次取出产品,现实中的流水车间也相似于此. publ

Java模拟生产者消费者问题

一.Syncronized方法详解 解决生产者消费这问题前,先来了解一下Java中的syncronized关键字. synchronized关键字用于保护共享数据.请大家注意"共享数据",你一定要分清哪些数据是共享数据,如下面程序中synchronized关键字保护的不是共享数据(其实在这个程序中synchronized关键字没有起到任何作用,此程序的运行结果是不可预先确定的).这个程序中的t1,t2是 两个对象(pp1,pp2)的线程.JAVA是面向对象的程序设计语言,不同的对象的数

Android-Java多线程通讯(生产者 消费者)&amp;10条线程对-等待唤醒/机制的管理

上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 的基础上,扩大规模增加10条线程去执行 生产者 消费者: 注意:?? 上一篇博客是两条线程在执行(生产者 消费者)例如:当Thread-0 锁.wait(); 等待 冻结后,  Thread-1 锁.notify(); 唤醒的一定是 T

Linux多线程模拟生产者/消费者问题

描述: 生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空间内执行的N个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供N个消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 输入: 生产者个数.消费者个数.还是缓冲

RabbitMQ基础概念详解(一)——环境配置及模拟生产者和消费者简单消息发送

一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信.而作为中间件的 RabbitMq 无疑是目前最流行的消息队列之一. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.

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

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

多线程模拟生产者消费者示例之BlockQuue

public class Test { public static void main(String[] args){ //创建一个阻塞队列,边界为1 BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1); new Thread(new PThread(queue)).start(); new Thread(new CThread(queue)).start(); }} /** * 生产者 */class P

java 用notifyAll和wait() 模拟生产者消费者模型

import java.util.LinkedList; import java.util.Queue; import java.util.Random; /** * Simple Java program to demonstrate How to use wait, notify and notifyAll() * method in Java by solving producer consumer problem. * * @author Javin Paul */ public cla