生产者与消费者以及多个容器的多线程问题(经典 集合了老师,同学以及自己的想法)

  1 package day2016_10_25_Thread;
  2
  3 import java.util.LinkedList;
  4 import java.util.Random;
  5
  6 public class Productor {
  7     public static void main(String[] args) throws InterruptedException {
  8
  9         //多个容器
 10         Box box = new Box();
 11         Box box2 = new Box();
 12
 13         //解决生产者,消费者,容器共用一个对象锁的问题
 14         Object obj=new Object();
 15         Producter p = new Producter(box, box2,obj);
 16         Customer c = new Customer(box, box2,obj);
 17
 18         Thread tp = new Thread(p, "productor");
 19         Thread tc = new Thread(c, "consumer");
 20
 21         tp.start();
 22         tc.start();
 23
 24         Thread.sleep(3000);
 25         System.out.println(box.size() + "--------------------" + box2.size());
 26     }
 27 }
 28
 29 class Producter implements Runnable {
 30     Object obj;
 31     Box box1;
 32     Box box2;
 33
 34     Producter(Box box1, Box box2,Object obj) {
 35         this.box1 = box1;
 36         this.box2 = box2;
 37         this.obj=obj;
 38     }
 39
 40     @Override
 41     public void run() {
 42
 43         System.out.println(Thread.currentThread().getName());
 44
 45         for (int i = 0; i < 30; i++) {
 46             synchronized (obj) {
 47                 obj.notify();
 48                 if(i==49){
 49                     System.out.println("生产者30次循环结束!");
 50                 }
 51                 if (box1.size() >= 10 && box2.size() >= 10) {
 52                     try {
 53                         obj.wait(); // 本线程等待
 54                     } catch (InterruptedException e) {
 55                         e.printStackTrace();
 56                     }
 57                 } else if (box1.size() >= 10 && box2.size() < 10) {
 58                     box2.push(new Bread("bread-" + i));
 59                     System.out.println(Thread.currentThread().getName()
 60                             + "-> box2 : " + box2.size());
 61                 } else if (box1.size() < 10 && box2.size() >= 10) {
 62                     box1.push(new Bread("bread-" + i));
 63                     System.out.println(Thread.currentThread().getName()
 64                             + "-> box1 : " + box1.size());
 65                 } else {
 66                     Random ran = new Random();
 67                     int num = ran.nextInt(2);
 68                     if (num == 0) {
 69                         box1.push(new Bread("bread-" + i));
 70                         System.out.println(Thread.currentThread().getName()
 71                                 + "-> box1 : " + box1.size());
 72                     } else {
 73                         box2.push(new Bread("bread-" + i));
 74                         System.out.println(Thread.currentThread().getName()
 75                                 + "-> box2 : " + box2.size());
 76                     }
 77                 }
 78             }
 79         }
 80
 81     }
 82 }
 83
 84 class Customer implements Runnable {
 85     Object obj;
 86     Box box1;
 87     Box box2;
 88
 89     Customer(Box box1, Box box2,Object obj) {
 90         this.box1 = box1;
 91         this.box2 = box2;
 92         this.obj=obj;
 93     }
 94
 95     @Override
 96     public void run() {
 97
 98         System.out.println(Thread.currentThread().getName());
 99
100         for (int i = 0; i < 30; i++) {
101             synchronized (obj) {
102                 obj.notify();
103                 if(i==49){
104                     System.out.println("消费者30次循环结束!");
105                 }
106                 if (box1.size() <= 3 && box2.size() <= 3) {
107                     try {
108                         obj.wait();
109                     } catch (InterruptedException e) {
110                         e.printStackTrace();
111                     }
112                 } else if (box1.size() <= 3 && box2.size() > 3) {
113                     Bread b2 = box2.pop();
114                     System.out.println(Thread.currentThread().getName()
115                             + "-> box2 : " + b2);
116                 } else if (box1.size() > 3 && box2.size() <= 3) {
117                     Bread b1 = box1.pop();
118                     System.out.println(Thread.currentThread().getName()
119                             + "-> box1 : " + b1);
120                 } else {
121                     Random ran = new Random();
122                     int num = ran.nextInt(2);
123                     if (num == 0) {
124                         Bread b1 = box1.pop();
125                         System.out.println(Thread.currentThread().getName()
126                                 + "-> box1 : " + b1);
127                     } else {
128                         Bread b2 = box2.pop();
129                         System.out.println(Thread.currentThread().getName()
130                                 + "-> box2 : " + b2);
131                     }
132
133                 }
134             }
135         }
136     }
137 }
138
139 class Box {
140     LinkedList<Bread> list = new LinkedList<Bread>();
141     int maxNum = 20;
142
143     public void push(Bread b) {
144         if (list.size() < maxNum) {
145             list.add(b);
146         }
147
148     }
149
150     public Bread pop() {
151         if (list.size() > 0) {
152             return list.remove();
153         }
154         return null;
155     }
156
157     public int size() {
158         return list.size();
159     }
160 }
161
162 class Bread {
163     private String sid;
164
165     Bread(String sid) {
166         this.sid = sid;
167     }
168
169     @Override
170     public String toString() {
171         return "sid= " + sid;
172     }
173
174 }

Productor.java

时间: 2025-01-18 08:17:36

生产者与消费者以及多个容器的多线程问题(经典 集合了老师,同学以及自己的想法)的相关文章

多线程——生产者和消费者(四)

通过前面三篇博客的介绍,基本上对Java的多线程有了一定的了解了,然后这篇博客根据生产者和消费者的模型来介绍Java多线程的一些其他知识. 我们这里的生产者和消费者模型为: 生产者Producer 生产某个对象(共享资源),放在缓冲池中,然后消费者从缓冲池中取出这个对象.也就是生产者生产一个,消费者取出一个.这样进行循环.   第一步:我们先创建共享资源的类 Person,它有两个方法,一个生产对象,一个消费对象 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

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__

[Dubbo开发]配置简单的生产者和消费者

配置好jdk1.7.Zookeeper和Maven环境之后,开始尝试第一次搭建简单的dubbo生产者和消费者. dubbo服务的原理,引用经典的官方图(cr.Dubbo官网): 关于Dubbo的原理和机制,在此不做赘述,具体可以查询官方文档:http://dubbo.apache.org/#!/?lang=zh-cn. 接下来开始搭建生产者和消费者. 1.生产者(Provider) 创建一个maven项目, 代码如下: (1)接口ProviderService.java package com.

Boost lockfree deque 生产者与消费者多对多线程应用

boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多线程,其效率要比使用上层的互斥锁要快很多,因为它直接使用底层的原子操作来进行同步数据的. freedeque.h 1 #pragma once#ifndef INCLUDED_UTILS_LFRINGQUEUE 2 #define INCLUDED_UTILS_LFRINGQUEUE 3 4 #de

生产者消费者(练习题:容器)

题目(生产者消费者模式):自定义同步容器,容器容量上限为10.可以在多线程中应用,并保证数据线程安全. 方式一:synchronized /** * 生产者消费者 * wait&notify * wait/notify都是和while配合应用的.可以避免多线程并发判断逻辑失效问题. */ import java.util.LinkedList; import java.util.concurrent.TimeUnit; public class TestContainer01<E> {

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.

生产者、消费者模型

转载地址:http://blog.csdn.net/snow_5288/article/details/72794306 一.概念引入 日常生活中,每当我们缺少某些生活用品时,我们都会去超市进行购买,那么,你有没有想过,你是以什么身份去的超市呢?相信大部分人都会说自己是消费者,确实如此,那么既然我们是消费者,又是谁替我们生产各种各样的商品呢?当然是超市的各大供货商,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的超市又该作何理解呢?诚然,它本身是作为一座交

简单的生产者和消费者模式

package com.roger.produceConsumer; /**  * 生产者和消费者  * 生产的数量需要和消费的数量一致  * @author Roger  */ public class Main {     public static void main(String[] args) {         // 初始化一个盛放数据的容器         SyncStack ss = new SyncStack();         Producer p = new Produc

Python 生产者与消费者模型

定义: 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度.     为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题于是引入了生产者和消费者模式.     什么是