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 ProduceCustom2 { public static void main(String[] args) { produce2 p1 = new produce2(); produce2 p2 = new produce2(); p1.setName("生產者1"); p2.setName("生產者1"); custom2 c1 = new custom2(); custom2 c2 = new custom2(); c1.setName("消費者1"); c2.setName("消費者2"); p1.start(); p2.start(); c1.start(); c2.start(); } } class Baozi2{ //public int id;//id和i在同一個類時能夠不用靜態或者直接不用id 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 produce2 extends Thread{ @Override public void run() { while(true){ Baozi2.lock.lock(); while(Baozi2.list.size()>=Baozi2.sum){ try { Baozi2.p.await(); } catch (InterruptedException e) { e.printStackTrace(); } } Baozi bz=new Baozi(); Baozi2.i++; bz.id=Baozi2.i; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 添加到數組中。 Baozi2.list.add(bz); System.out.println(Thread.currentThread().getName() + "生產了一個包子:" + bz.id + ",現有" + Baozi2.list.size()); // 喚醒對方(生產者) Baozi2.c.signal(); Baozi2.lock.unlock(); } } } class custom2 extends Thread{ @Override public void run() { while(true){ Baozi2.lock.lock(); while(Baozi2.list.size()==0){ try { Baozi2.c.await(); } catch (InterruptedException e) { e.printStackTrace(); } } int index = (int) (Math.random() * Baozi2.list.size()); Baozi baozi2 = Baozi2.list.remove(index); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "消費了一個包子,id爲" + baozi2.id + ",現有" + Baozi2.list.size()); //喚醒對方 Baozi2.p.signal(); Baozi2.lock.unlock(); } } }