import java.util.concurrent.locks.*; public class Test23 { public static void main(String[] args) { Resource r = new Resource(); String x = "黄焖鸡"; PutX px = new PutX(r, x); TakeX tx = new TakeX(r, x); Thread t0 = new Thread(px); Thread t1 = new Thread(px); Thread t2 = new Thread(tx); Thread t3 = new Thread(tx); t0.start(); t1.start(); t2.start(); t3.start(); } } class Resource { Lock lock = new ReentrantLock(); Condition full = lock.newCondition(); Condition empty = lock.newCondition(); private String[] item = new String[400]; private int taker = 0; private int puter = 0; private int count = 0; public void put(String x) { while (true) { lock.lock(); //用while不用if是因为当多个线程在这里等待后,被唤醒,需要重新判断这个条件 while (count == item.length) { try { full.await(); } catch (InterruptedException e) { } } item[puter] = x; System.out.println(Thread.currentThread().getName() + "..." + count + "...put.." + x); if (puter == item.length - 1) { puter = -1; empty.signalAll(); } ++count; ++puter; lock.unlock(); } } public void take(String x) { while (true) { lock.lock(); while (count == 0) { try { empty.await(); } catch (InterruptedException e) { } } x = item[taker]; System.out.println(Thread.currentThread().getName() + "..." + (count - 1) + "..take......" + x); if (taker == item.length - 1) { taker = -1; full.signalAll(); } --count; ++taker; lock.unlock(); } } } class PutX implements Runnable { Resource r; String x; PutX(Resource r, String x) { this.r = r; this.x = x; } public void run() { r.put(x); } } class TakeX implements Runnable { Resource r; String x; TakeX(Resource r, String x) { this.r = r; this.x = x; } public void run() { r.take(x); } }
时间: 2024-11-05 13:39:50