線程同步—生產消費問題

import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;java

public class Demo05_Goods {
 private Object[] goods = new Object[1]; // 1:聲明產品庫
 private static Lock lock = new ReentrantLock();
 private static Condition con = lock.newCondition();dom

 // 2:開發一個方法用於向goods裏面產產品,用一個線程不斷的調用這個方法
 public void make() {
  lock.lock();
   while (goods[0] != null) {
    
    try {
     con.await();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }finally {
     lock.unlock();
    }
   }
   int a = new Random().nextInt(100);// 0~99之間的任意值
   goods[0] = a;
   System.err.println("生產一個產品:" + goods[0]);
   // 生產完成之後,就去通知購買人能夠購買了
   con.signal();
  }
 ide

 // 3:開發一個方法不斷的去購買
 public void buy() {
  lock.lock();
   // 判斷若是沒有沒有產品,就去等
   while (goods[0] == null) {
    try {
     con.await();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   Object obj = goods[0];
   goods[0] = null;
   System.err.println("---------------------------購買到一個產品:" + obj);
   con.signal();
  }
 線程

 Thread maker = new Thread() {
  @Override
  public void run() {
   while (true) {
    make();
    try {
     Thread.sleep(100 * new Random().nextInt(4));
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 };code

 Thread buyer = new Thread() {
  public void run() {
   while (true) {
    buy();
    try {
     Thread.sleep(100 * new Random().nextInt(4));
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  };
 };開發

 public Demo05_Goods() {
  maker.start();
  buyer.start();
 }產品

 public static void main(String[] args) {
  new Demo05_Goods();
 }it

}
io

相關文章
相關標籤/搜索