Thread--生产者消费者

2个生产者,2个消费者,库存容量2

 1 package p_c_allWait.copy;
 2
 3 import java.util.LinkedList;
 4 import java.util.List;
 5
 6 public class ValueObject {
 7
 8     public static final int MAX = 2;
 9
10 //    public static String value = "";
11
12     public static List<String> list = new LinkedList<String>();
13
14 }
 1 package p_c_allWait.copy;
 2
 3 public class P {
 4
 5     private String lock;
 6
 7     public P(String lock) {
 8         super();
 9         this.lock = lock;
10     }
11
12     public void setValue() {
13         try {
14             synchronized (lock) {
15                 while(ValueObject.list.size() >= ValueObject.MAX) {
16                     System.out.println("生产者 " + Thread.currentThread().getName() + " WAITING 了 库存 : " + ValueObject.list.size());
17                     lock.wait();
18                 }
19                 String value = System.currentTimeMillis() + "_" + System.nanoTime();
20                 ValueObject.list.add(value);
21                 System.out.println("生产者 " + Thread.currentThread().getName() + " RUNNABLE 了 库存 : " + ValueObject.list.size());
22                 lock.notifyAll();
23             }
24         } catch (Exception e) {
25             // TODO: handle exception
26             e.printStackTrace();
27         }
28     }
29
30 }
 1 package p_c_allWait.copy;
 2
 3 public class C {
 4
 5     private String lock;
 6
 7     public C(String lock) {
 8         super();
 9         this.lock = lock;
10     }
11
12     public void getValue() {
13         try {
14             synchronized (lock) {
15                 while(ValueObject.list.size()<=0) {
16                     System.out.println("消费者 " + Thread.currentThread().getName() + " wating 了 库存 : " + ValueObject.list.size());
17                     lock.wait();
18                 }
19                 ValueObject.list.remove(0);
20                 System.out.println("消费者 " + Thread.currentThread().getName() + " RUNNABLE 了 库存 : " + ValueObject.list.size());
21                 lock.notifyAll();
22             }
23         } catch (Exception e) {
24             // TODO: handle exception
25             e.printStackTrace();
26         }
27     }
28
29 }
 1 package p_c_allWait.copy;
 2
 3 public class ThreadP extends Thread {
 4
 5     private P p;
 6
 7     public ThreadP(P p) {
 8         super();
 9         this.p = p;
10     }
11
12     @Override
13     public void run() {
14         while(true) {
15             p.setValue();
16         }
17     }
18
19 }
 1 package p_c_allWait.copy;
 2
 3 public class ThreadC extends Thread {
 4
 5     private C c;
 6
 7     public ThreadC(C c) {
 8         super();
 9         this.c = c;
10     }
11
12     @Override
13     public void run() {
14         while(true) {
15             c.getValue();
16         }
17     }
18
19
20
21 }
 1 package p_c_allWait.copy;
 2
 3 public class Run {
 4
 5     public static void main(String[] args) {
 6         String lock = "";
 7         P p = new P(lock);
 8         C r = new C(lock);
 9         ThreadP[] pThread = new ThreadP[2];
10         ThreadC[] cThread = new ThreadC[2];
11         for(int i=0; i<2; i++) {
12             pThread[i] = new ThreadP(p);
13             pThread[i].setName("生产者 " + (i+1));
14             cThread[i] = new ThreadC(r);
15             cThread[i].setName("消费者 " + (i+1));
16             pThread[i].start();
17             cThread[i].start();
18         }
19     }
20
21 }
时间: 2024-10-01 07:28:48

Thread--生产者消费者的相关文章

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

生产者消费者模型实现多线程异步交互

[Python之旅]第六篇(五):生产者消费者模型实现多线程异步交互 消息队列 生产者消费者模型 多线程异步交互 摘要:  虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 1.生产者消费者模型:厨师做包子与顾客吃包子 2.Python的消息队列 3.利用... 虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应

并发编程基础之生产者消费者模式

一:概念 生产者消费者模式是java并发编程中很经典的并发情况,首先有一个大的容器,生产者put元素到 容器中,消费者take元素出来,如果元素的数量超过容器的容量时,生产者不能再往容器中put元素 ,处于阻塞状态,如果元素的数量等于0,则消费者不能在从容器中take数据,处于阻塞状态. 二:示例 /** * */ package com.hlcui.main; import java.util.LinkedList; import java.util.concurrent.ExecutorSe

使用BlockingQueue的生产者消费者模式

BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示: 通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出:在生产者消费者模式中,通过队列的方式可以很方便的实现两者之间的数据共享.强大的BlockingQueue使我们不用关心什么时候需要阻塞线程,什么时候需要唤醒线程. BlockingQueue的

JAVA并发编程6_线程协作/生产者-消费者

前面通过同步锁来同步任务的行为,两个任务在交替访问共享资源的时候,可以通过使用同步锁使得任何时候只有一个任务可以访问该资源,见博客:线程同步之synchronized关键字.下面主要讲的是如何使任务彼此间可以协作,使得多个任务可以一起工作去解决木某个问题,因为有些问题中,某些部分必须在其他部分被解决之前解决,就像在餐厅服务员要端菜就必须有厨师做好了菜.在任务协作时,可以让任务自身挂起,直至某些外部条件发生变化,表示是时候让这个任务向前推动了为止. wait/notify wait方法会在等待外部

线程同步之生产者消费者

前言: 前面因时间关系,未将“生产者消费者问题”实例的介绍发布在博客随笔中,故本文作为对之前“多线程”一文的补充.概念: 生产者消费者问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.这个案例中主要实现的是两个角色协同对同一资源进行访问.生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗这些数据.该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据. 设计:本博客前面关于多线程的文

生产者消费者模式(吃包子例子)

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

Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond

Java模拟生产者消费者问题

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

Java 并发编程(四)阻塞队列和生产者-消费者模式

阻塞队列 阻塞队列提供了可阻塞的 put 和 take 方法,以及支持定时的 offer 和 poll 方法.如果队列已经满了,那么put方法将阻塞直到有空间可以用:如果队列为空,那么take方法将一直阻塞直到有元素可用.队列可以使有界的,也可以是无界的,无界队列永远都不会充满,因此无界队列上的put方法永远不会阻塞.一种常见的阻塞生产者-消费者模式就是线程池与工作队列的组合,在 Executor 任务执行框架中就体现了这种模式. 意义:该模式能简化开发过程,因为他消除了生产者和消费者类之间的代