java_Thread生产者与消费者 Demo

  1 package com.bjsxt.Thread.Demo;
  2 public class ProducerConsumer {
  3     /**
  4      * 生产者与消费者
  5      * @param args
  6      */
  7     public static void main(String[] args) {// 模拟线程
  8         SyncStack ss = new SyncStack();
  9         Producer p = new Producer(ss);
 10         Consumer c = new Consumer(ss);
 11         new Thread(p).start();// 开启线程
 12         new Thread(c).start();// 开启线程
 13     }
 14 }
 15
 16 /**
 17  * Woto类
 18  */
 19 class WoTo {
 20     int id;
 21     WoTo(int id) {
 22         this.id = id;
 23     }
 24     public String toString() {
 25         return "WoTo : " + id;
 26     }
 27 }
 28
 29 /**
 30  * 框类(用来装馒头)
 31  * @author wenfei
 32  */
 33 class SyncStack {
 34     int index = 0;
 35     WoTo[] arrwt = new WoTo[6];
 36
 37     public synchronized void push(WoTo wt) {
 38
 39         while (index == arrwt.length) {
 40
 41             try {
 42                 this.wait();// 暂定当前对象
 43
 44             } catch (InterruptedException e) {
 45                 e.printStackTrace();
 46             }
 47         }
 48         this.notify();// 叫醒当前线程
 49         arrwt[index] = wt;
 50         index++;
 51     }
 52
 53     public synchronized WoTo pop() {
 54         while (index == 0) {
 55
 56             try {
 57                 this.wait();
 58             } catch (InterruptedException e) {
 59                 e.printStackTrace();
 60             }
 61         }
 62         this.notify();
 63         index--;
 64         return arrwt[index];
 65     }
 66 }
 67
 68 /**
 69  * 生产者
 70  *
 71  * @author wenfei
 72  */
 73 class Producer implements Runnable {
 74     SyncStack ss = null;
 75
 76     Producer(SyncStack ss) {
 77         this.ss = ss;
 78     }
 79
 80     @Override
 81     public void run() {
 82         // 生产wt
 83         for (int i = 0; i <= 100; i++) {
 84             WoTo wt = new WoTo(i);
 85             ss.push(wt);// 往篮子里装窝头
 86             System.out.println("生产了--->" + wt);
 87             try {
 88                 // Thread.sleep(1000);//每生产一个睡眠一秒
 89                 Thread.sleep((int) Math.random() * 1000);
 90             } catch (InterruptedException e) {
 91                 // TODO Auto-generated catch block
 92                 e.printStackTrace();
 93             }
 94         }
 95     }
 96
 97 }
 98
 99 /**
100  * 消费者
101  *
102  * @author wenfei
103  */
104 class Consumer implements Runnable {
105     SyncStack ss = null;
106
107     Consumer(SyncStack ss) {
108         this.ss = ss;
109     }
110
111     @Override
112     public void run() {
113         for (int i = 0; i <= 100; i++) {
114             WoTo wt = ss.pop();
115             System.out.println("消费了--->" + wt);
116             try {
117                 // Thread.sleep(1000);//每消费一个睡眠一秒
118                 Thread.sleep((int) Math.random() * 1000);//
119             } catch (InterruptedException e) {
120                 // TODO Auto-generated catch block
121                 e.printStackTrace();
122             }
123             // System.out.println(wt);
124         }
125     }
126
127 }
时间: 2024-10-03 20:47:23

java_Thread生产者与消费者 Demo的相关文章

java 生产者和消费者demo

1 package com.benq; 2 3 import java.util.*; 4 import java.util.concurrent.TimeUnit; 5 6 public class HH { 7 public static void main(String[] args){ 8 9 var store=new MyStore<Integer>(20); 10 11 for(int i=0;i<10;i++){ 12 var producer=new Procuder&

Java中的生产者、消费者问题

Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还

多线程编程之生产者和消费者之间的问题

前段时间没事研究了一些生产者和消费者之间的问题,期间也查看了不少资料.又重新有了新的认识.特别作为一个IT农民工,必须要掌握的技能啊. 个人理解,这个应该说是一种模型吧,学会它,可以应用到多个方面的技术上去.数据流文件的读写,程序中的数据缓冲技术,播放缓冲技术等等. 废话不多说...直接上代码.下面是个C# 写的代码.比较粗糙,请谅解,有问题大家可以一起讨论研究. 1 using System; 2 using System.Threading; 3 4 namespace Consumer 5

生产者和消费者

package demo.thread; /** *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品. *其中生产者和消费者都可以有若干个.仓库容量有限,库满时不能存放,库空时不能取产品 */ public class ProducersAndConsumers { public static void main(String[] args) { Storage storage = new Storage(); Thread consumer = new Thread

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

一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所有线程2.为什么这些方法不定义在Thread类中呢?  这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象.  所以,这些方法必须定义在Object类中.3.当我们在使用多线程的时候有的时候需要,一条线程产生一个数据,另一条线程接着消费一个数据,一边生产一边消费,

生产者与消费者案例

(多线程的开发中最经典的操作案例,生产者不断生产产品,消费者不断取走产品) public class Demo { /*  * 生产者.消费者问题  *   * 生产者将产品交给店员,而消费者从店员取走产品,店员一次只能持有固定数量的产品,  * 如果生产者生产了过多的产品,店员会叫生产者等一下,如果店中有空位放产品了在通知生产者继续生产:  * 如果店中没有了产品,店员会告诉消费者等一下,如果店中有产品了再通知消费者取走产品.  *  */ } //店员 public class Clerk 

多线程学习笔记五-------------多生产者多消费者问题

线程通信--多生产者多消费者问题 多生产者,多消费者会导致线程死锁的情况. public class RoastDuck { public static void main(String[] args) { Duck d = new Duck(); ProductProcess pp = new ProductProcess(d); ProductProcess pp0 = new ProductProcess(d); ConsumeProcess cp = new ConsumeProcess

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

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

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