package com.ProudceCustom; import java.util.ArrayList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ProduceCustom { public static void main(String[] args) { produce p1 = new produce(); produce p2 = new produce(); p1.setName("生產者1"); p2.setName("生產者1"); custom c1 = new custom(); custom c2 = new custom(); c1.setName("消費者1"); c2.setName("消費者2"); p1.start(); p2.start(); c1.start(); c2.start(); } } class Baozi{ public int id; } class Basket{ public static ArrayList<Baozi> list=new ArrayList<Baozi>(); public static int sum=6; public static int i; public static Lock lock=new ReentrantLock(); public static Condition p=lock.newCondition(); public static Condition c=lock.newCondition(); } class produce extends Thread{ @Override public void run() { while(true){ Basket.lock.lock(); while(Basket.list.size()>=Basket.sum){ try { Basket.p.await(); } catch (InterruptedException e) { e.printStackTrace(); } } Baozi bz=new Baozi(); Basket.i++; bz.id=Basket.i; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 添加到數組中。 Basket.list.add(bz); System.out.println(Thread.currentThread().getName() + "生產了一個包子:" + bz.id + ",現有" + Basket.list.size()); // 喚醒對方(生產者) Basket.c.signal(); Basket.lock.unlock(); } } } class custom extends Thread{ @Override public void run() { while(true){ Basket.lock.lock(); while(Basket.list.size()==0){ try { Basket.c.await(); } catch (InterruptedException e) { e.printStackTrace(); } } int index = (int) (Math.random() * Basket.list.size()); Baozi baozi2 = Basket.list.remove(index); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "消費了一個包子,id爲" + baozi2.id + ",現有" + Basket.list.size()); //喚醒對方 Basket.p.signal(); Basket.lock.unlock(); } } }