生产者和消费者多线程共享一个仓库(多竞争一)
来源:互联网 发布:cnc编程兼职工资怎么算 编辑:程序博客网 时间:2024/05/29 18:16
package org.java.Thread;
public class MultiThread {
//定义一个仓库的容量
private final int MAX_SIZE = 100;
//定义一个显著仓库的商品的数量
private int current;
//数据仓库的构造方法
//初始化他的现在库存量
public MultiThread(int current){
this.current = current;
}
//仓库是一个共享资源,所以定义两个方法,存放商品和销售商品
public synchronized void produce(int produceNum){
//获得生产者的名字
String name = Thread.currentThread().getName();
while((current+produceNum)>MAX_SIZE){
//我会会思考,为什么是一个while循环,而不是一个if(),后来我知道了、
//如果是if,那么这个线程先被wait,过后,只要一被唤醒notify,那么
//这个线程就执行完了,而不能达到要求。用while的好处就是,唤醒它
//让它又去判断一次是不是达到要求,达到跳出这个循环时候,这个线程就到达了要求
//去完成自己的任务。
System.out.println("仓库现在的商品量是:"+current+","+name+"不能把自己生产的"+produceNum+"个商品放入仓库了,不然就爆仓了");
try {
//当没有达到要求,就释放锁,给其他线程去锁定这个一起共享的(单独)对象
//那么这个线程就这里等待~~,当唤醒的时候,再去判断,符合才去完成它的任务。
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
current += produceNum;
System.out.println(name+"把自己生产的"+produceNum+"个商品放入仓库中!");
System.out.println("现在仓库的商品量是:"+current);
//多个线程共享一个对象,这个对象用notifyAll方法来唤醒
notifyAll();
}
//销售商品
public synchronized void reduce(int reduceNum){
String name = Thread.currentThread().getName();
while((current-reduceNum)<0){
System.out.println("仓库现在的商品量是:"+current+","+name+"不能从仓库拿走"+reduceNum+"个商品");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
current -= reduceNum;
System.out.println(name+"从仓库中拿走了"+reduceNum+"个商品!");
System.out.println("现在仓库的商品量是:"+current);
notifyAll();
}
public static void main(String[] args){
MultiThread mul = new MultiThread(30);
Producer p1 = new Producer("p1",10,mul);
Producer p2 = new Producer("p2",20,mul);
Producer p3 = new Producer("p3",30,mul);
Producer p4 = new Producer("p4",40,mul);
Producer p5 = new Producer("p5",50,mul);
Consumer c1 = new Consumer("c1",20,mul);
Consumer c2 = new Consumer("c2",30,mul);
Consumer c5 = new Consumer("c5",50,mul);
Consumer c3 = new Consumer("c3",40,mul);
Consumer c4 = new Consumer("c4",40,mul);
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
}
}
class Producer extends Thread{
//生产的商品个数
private int produceNum;
private String name;
private MultiThread multiThread;
public Producer(String name,int produceNum, MultiThread multiThread) {
super(name);
this.name = name;
this.produceNum = produceNum;
this.multiThread = multiThread;
}
public void run(){
System.out.println(name+"打算把最近生产的"+produceNum+"个商品放入仓库中");
multiThread.produce(produceNum);
}
}
class Consumer extends Thread{
//生产的商品个数
private int reduceNum;
private String name;
private MultiThread multiThread;
public Consumer(String name,int reduceNum, MultiThread multiThread) {
super(name);
this.name = name;
this.reduceNum = reduceNum;
this.multiThread = multiThread;
}
public void run(){
System.out.println(name+"准备去仓库里拿走"+reduceNum+"个商品");
multiThread.reduce(reduceNum);
}
}
- 生产者和消费者多线程共享一个仓库(多竞争一)
- c# 多线程--生产者和消费者(一)
- java多线程 一个生产者和多个消费者
- 生产者和消费者(一)
- 多线程生产者和消费者
- 多线程,生产者和消费者
- 多线程,生产者和消费者
- 多线程--生产者和消费者
- Java多线程生产者/消费者模式(一)
- c# 多线程---生产者和消费者(二)
- Windows 多线程(七) 生产者和消费者
- 多线程问题(生产者和消费者)
- 多线程模型:生产者和消费者
- 多线程案例:生产者和消费者
- c#多线程 生产者和消费者
- C#多线程------生产者和消费者
- 多线程,生产者和消费者原型
- 多线程生产者和消费者例子
- 【动态规划 变形】Pick numbers:实际上还是背包
- 高手速成android开源项目【View篇】
- Spring容器-Bean的生命周期
- 黑马程序员——装饰设计模式(io流)
- C++手记:常量引用
- 生产者和消费者多线程共享一个仓库(多竞争一)
- 开题第一次修改
- 黑马程序员------------------交通灯管理系统
- 在OpenCV中利用鼠标绘制直线
- MySQL数据库提示:Communications link failure,The last packet succe
- Java中日历对象,非常实用
- SGU 129 Inheritance(计算几何)
- Jquery总结
- thinking in asp 之三 低调奢华有内涵