import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by enali on 2016/12/20.
*/
class Depot4 {
private int capacity;
private int size;
private Lock lock;
private Condition pro;
public Depot4(int cap) {
this.capacity = cap;
this.size = 0;
this.lock = new ReentrantLock();
this.pro = lock.newCondition();
}
public void produce(int val) {
Random rd = new Random();
while (true) {
try {
Thread.sleep(rd.nextInt(1000));
lock.lock();
while (capacity - size < val)
pro.await();
System.out.printf("%s produce %3d, size: %3d-->%3d\n",
Thread.currentThread().getName(), val, size, size + val);
size += val;
pro.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public void consume(int val) {
Random rd = new Random();
while (true) {
int rval = rd.nextInt(val);
try {
Thread.sleep(rd.nextInt(1000));
lock.lock();
while (size < rval)
pro.await();
System.out.printf("%s consume %3d, size: %3d-->%3d\n",
Thread.currentThread().getName(), rval, size, size-rval);
size -= rval;
pro.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
class Producer4 {
Depot4 dp;
public Producer4(Depot4 dp) {
this.dp = dp;
}
public void produce(final int val, String name) {
new Thread(
new Runnable() {
@Override
public void run() {
dp.produce(val);
}
}, name
).start();
}
}
class Consumer4 {
Depot4 dp;
public Consumer4(Depot4 dp) {
this.dp = dp;
}
public void consume(final int val, String name) {
new Thread(
new Runnable() {
@Override
public void run() {
dp.consume(val);
}
}, name
).start();
}
}
public class Demo4 {
public static void main(String[] args) {
Depot4 dp = new Depot4(5);
Producer4 pro = new Producer4(dp);
Consumer4 con = new Consumer4(dp);
pro.produce(1, "P_A");
pro.produce(2, "P_B");
con.consume(5, "C_A");
}
}