多線程(生產者,消費者)的簡單實現

package com.lzg;
public class ThreadDemo02 {
 public static void main(String[] args) {
  Resource resource = new Resource();
  Thread p1 = new Thread(new Producer("生產者1 ", 50, resource));
  Thread p2 = new Thread(new Producer("生產者2 ", 30, resource));
  Thread c1 = new Thread(new Custormer("消費者1 ", 50, resource));
  Thread c2 = new Thread(new Custormer("消費者2 ", 30, resource));
  p1.start();
  p2.start();
  c1.start();
  c2.start();
 }
}
class Resource {
 public static final int MAX_SIZE = 100;
 private int current_size = 0;
 public int getCurrent_size() {
  return current_size;
 }
 public void setCurrent_size(int current_size) {
  this.current_size = current_size;
 }
 public synchronized void produrce(int num, String name) {
  System.out.println("當前倉庫剩餘容量: " + (Resource.MAX_SIZE - current_size) + "----------" + name + "準備生產: " + num);
  while (current_size + num > Resource.MAX_SIZE) // 超過最大容量
  {
   try {
    System.out.println("倉庫存不下,請等待");
    wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  current_size += num;
  System.out.println(name + "生產了 : " + num + "個產品-------------------" + "當前倉庫剩餘容量爲"
    + (Resource.MAX_SIZE - current_size));
  notify();
 }
 public synchronized void consume(int num, String name) {
  System.out.println("當前倉庫剩餘產品: " + current_size + "********" + name + " 準備消費: " + num);
  while (current_size < num) {
   try {
    System.out.println("倉庫沒貨,請等待");
    wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  current_size -= num;
  System.out.println(name + "已經消費: " + num + "************ 當前倉庫剩餘產品: " + current_size);
  notify();
 }
}
class Producer implements Runnable {
 private Resource r;
 private String name;
 private int num;
 public Producer(String name, int num, Resource r) {
  this.name = name;
  this.num = num;
  this.r = r;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  int i = 0;
  while (i++ < 10) {
   r.produrce(num, name);
  }
 }
}
class Custormer implements Runnable {
 private Resource r;
 private String name;
 private int num;
 public Custormer(String name, int num, Resource r) {
  this.name = name;
  this.num = num;
  this.r = r;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  int i = 0;
  while (i++ < 10) {
   r.consume(num, name);
  }
 }
}
相關文章
相關標籤/搜索