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

 package p_c_allWait.copy;

 import java.util.LinkedList;
import java.util.List; public class ValueObject { public static final int MAX = 2; // public static String value = ""; public static List<String> list = new LinkedList<String>(); }
 package p_c_allWait.copy;

 public class P {

     private String lock;

     public P(String lock) {
super();
this.lock = lock;
} public void setValue() {
try {
synchronized (lock) {
while(ValueObject.list.size() >= ValueObject.MAX) {
System.out.println("生产者 " + Thread.currentThread().getName() + " WAITING 了 库存 : " + ValueObject.list.size());
lock.wait();
}
String value = System.currentTimeMillis() + "_" + System.nanoTime();
ValueObject.list.add(value);
System.out.println("生产者 " + Thread.currentThread().getName() + " RUNNABLE 了 库存 : " + ValueObject.list.size());
lock.notifyAll();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
 package p_c_allWait.copy;

 public class C {

     private String lock;

     public C(String lock) {
super();
this.lock = lock;
} public void getValue() {
try {
synchronized (lock) {
while(ValueObject.list.size()<=0) {
System.out.println("消费者 " + Thread.currentThread().getName() + " wating 了 库存 : " + ValueObject.list.size());
lock.wait();
}
ValueObject.list.remove(0);
System.out.println("消费者 " + Thread.currentThread().getName() + " RUNNABLE 了 库存 : " + ValueObject.list.size());
lock.notifyAll();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
 package p_c_allWait.copy;

 public class ThreadP extends Thread {

     private P p;

     public ThreadP(P p) {
super();
this.p = p;
} @Override
public void run() {
while(true) {
p.setValue();
}
} }
 package p_c_allWait.copy;

 public class ThreadC extends Thread {

     private C c;

     public ThreadC(C c) {
super();
this.c = c;
} @Override
public void run() {
while(true) {
c.getValue();
}
} }
 package p_c_allWait.copy;

 public class Run {

     public static void main(String[] args) {
String lock = "";
P p = new P(lock);
C r = new C(lock);
ThreadP[] pThread = new ThreadP[2];
ThreadC[] cThread = new ThreadC[2];
for(int i=0; i<2; i++) {
pThread[i] = new ThreadP(p);
pThread[i].setName("生产者 " + (i+1));
cThread[i] = new ThreadC(r);
cThread[i].setName("消费者 " + (i+1));
pThread[i].start();
cThread[i].start();
}
} }

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

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

     *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...

  2. 【Python@Thread】queue模块-生产者消费者问题

    python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 from random import randint from ...

  3. Java Thread系列(十)生产者消费者模式

    Java Thread系列(十)生产者消费者模式 生产者消费者问题(producer-consumer problem),是一个多线程同步问题的经典案例.该问题描述了两个共亨固定大小缓冲区的线程-即所 ...

  4. 队列&生产者消费者

    Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用多线程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间信息传递. 如果在多线程中,给存放数据,也就是修改同一份 ...

  5. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  6. Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

    生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...

  7. python-实现生产者消费者模型

    生产者消费者:包子铺不停的做包子,行人不停的买 ---> 这样就达到了目的--->包子的销售 两个不同的角色 包子铺,行人 只负责单一操作 让包子变成连接的介质. #_*_coding:u ...

  8. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  9. Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

    Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...

  10. C++11实现生产者消费者问题

    生产者消费者问题是多线程并发中一个非常经典的问题.我在这里实现了一个基于C++11的,单生产者单消费者的版本,供大家参考. #include <windows.h> #include &l ...

随机推荐

  1. POJ2533:Longest Ordered Subsequence

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 37454   Acc ...

  2. 禁用u盘再启用

    将u盘量产为CDROM后,刷入ISO后需要重新插拔u盘才能访问新内容.此文展示的代码可以实现模拟这种行为,免插拔使windows重新读取cdrom. 网上参考资料有限,自行试验了很多种方法,终于成功了 ...

  3. DRF项目之实现用户密码加密保存

    在DRF项目的开发中,我们通过直接使用序列化器保存的用户信息时,用户的密码是被明文保存到数据库中. 代码实现: def create(self, validated_data): '''重写creat ...

  4. 160-PHP 文本替换函数str_replace(一)

    <?php $str='Hello world!'; //定义源字符串 $search='o'; //定义将被替换的字符 $replace='O'; //定义替换的字符串 $res=str_re ...

  5. Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  6. 两表关联更新数据——oracle

    from testb b where b.id=a.id) ; (where exists(select 1 from testb b where b.id=a.id):如果没有这个条件,不匹配的选项 ...

  7. kubernter相关内容

    1. Kubernetes 第一章:互联网架构的演变 随着1946年世界上第一台电子计算机的问世网络就随之出现了,只不过当初只是为了解决多个终端之间的连接,这就是局域网的雏形.后来,随着美国国防部高级 ...

  8. NRF52811-QCAA 蓝牙5.1芯片资料解析

    为了满足市场需求Nordic 宣布推出nRF52811系统级芯片(SoC),这个全功能无线连接解决方案支持蓝牙5.1 测向(Direction Finding)功能和一系列流行低功耗无线协议,用于智能 ...

  9. 【LeetCode】分发糖果

    [问题]老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中 ...

  10. 十九、CI框架之数据库操作delete用法

    一.代码如下: 二.执行f访问 三.查看数据库,已经id=15的数据已经被删掉了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦, ...