package threadJDK5; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ArrayListTestJDK5 { public static final int Sorge_Size = 10; public static void main(String[] args) { ArrayListStorge storge = new ArrayListStorge(); P p = new P(storge); M m = new M(storge); Thread t1 = new Thread(p); Thread t2 = new Thread(p); Thread t3 = new Thread(p); Thread t4 = new Thread(p); Thread t5 = new Thread(m); Thread t6 = new Thread(m); Thread t7 = new Thread(m); Thread t8 = new Thread(m); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); t7.start(); t8.start(); } } class ArrayListStorge{ private List<Integer> list = new ArrayList(ArrayListTestJDK5.Sorge_Size); private int num; private Lock lock = new ReentrantLock(); private Condition condition_p = lock.newCondition(); private Condition condition_m = lock.newCondition(); public void set(ArrayListStorge s){ lock.lock(); while(list.size()>=ArrayListTestJDK5.Sorge_Size){ try { condition_p.await(); } catch (InterruptedException e) { e.printStackTrace(); } } s.list.add(num++); System.out.println(Thread.currentThread().getName()+"...存入----"+s.list.get(s.list.size()-1)); if(s.list.size()>0){ condition_m.signal(); lock.unlock(); } } public void out(ArrayListStorge s){ lock.lock(); while(s.list.size()<=0){ try { condition_m.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"...取出-----"+s.list.remove(s.list.size()-1)); if(s.list.size()<=0){ condition_p.signal(); lock.unlock(); } } } class P implements Runnable{ private ArrayListStorge s; public P(ArrayListStorge s){ this.s = s; } public void run(){ while(true){ s.set(s); } } } class M implements Runnable{ private ArrayListStorge s; public M(ArrayListStorge s){ this.s = s; } public void run(){ while(true){ s.out(s); } } }