生产者和消费者多线程共享一个仓库(多竞争一)

来源:互联网 发布: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);
 }
}
 

0 0
原创粉丝点击