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);
}
}