用JAVA实现多线程(生产者与消费者问题)


public class MultiThread {

 public static void main(String[] args) {
  ProductStack box = new ProductStack("box");
  Producer p1 = new Producer(box, "p1");
  Producer p2 = new Producer(box, "p2");
  Producer p3 = new Producer(box, "p3");
  Consumer c1 = new Consumer(box, "c1");
  Consumer c2 = new Consumer(box, "c2");
  //Consumer c3=new Consumer(box,"c3");
  //Consumer c4=new Consumer(box,"c4");
   //Consumer c5=new Consumer(box,"c5");
  p1.start();
  p2.start();
  p3.start();
  c1.start();
  c2.start();
    //c3.start();
     //c4.start();
    // c5.start();

 }

}

class Product {
 int id;

 public Product(int id) {
  this.id = id;
 }

 public String toSring() {
  return "Product" + id;
 }
}

class ProductStack {
 String name;

 static int point = 0;

 private Product[] p = new Product[10];

 public ProductStack(String name) {
  this.name = name;
 }

 public String getname() {
  return name;
 }

 public synchronized int getpoint() {
  return point;
 }

 public synchronized void push(Product a) {
  while (point >= p.length) {
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   this.notifyAll();
  }

  p[point] = a;
  // System.out.println(point);
  // System.out.println(p[point].toSring());
  point++;
  // yield();
 }

 private void yield() {
 }

 public synchronized Product pop() {
  while (point == 0) {
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   this.notifyAll();
  }
  point--;
  // System.out.println(point);
  // Product get=p[point];
  // System.out.println(p[point].toSring());
  // yield();
  return p[point];
 }
}

class Producer extends Thread {
 private ProductStack container = new ProductStack("container");

 public Producer(ProductStack s, String name) {
  super(name);
  container = s;
 }

 public void run() {
  Product m = new Product(0);
  for (int i = 0; i < 20; i++) {
   synchronized (container) {
    m.id = container.getpoint() + 1;
    container.push(m);
    System.out.println(currentThread().getName() + " 生产了 "
      + m.toSring());
    // }
    try {
     Thread.sleep((int) (Math.random() * 2000));
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }
}

class Consumer extends Thread {
 private ProductStack container = new ProductStack("container");

 public Consumer(ProductStack s, String name) {
  super(name);
  container = s;
 }

 public void run() {
  Product n = new Product(0);
  for (int j = 0; j < 20; j++) {
   synchronized (container) {
    n = container.pop();
    System.out.println(currentThread().getName() + " 消耗了 "
      + n.toSring());
    // }
    yield();
    try {
     Thread.sleep((int) (Math.random() * 2000));
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值