代码如下:public class Bw {
static class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[10];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
static class Put implements Runnable{
private BoundedBuffer boundedBuffer;
public Put(BoundedBuffer boundedBuffer) {
this.boundedBuffer=boundedBuffer;
}
@Override
public void run() {
for (int i=0;i<10;i++) {
try {
System.out.println(Thread.currentThread()+" 生产者生产:"+(i+1));
boundedBuffer.put(Integer.valueOf(i));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Get implements Runnable{
private BoundedBuffer boundedBuffer;
public Get(BoundedBuffer boundedBuffer) {
this.boundedBuffer=boundedBuffer;
}
@Override
public void run() {
for (int i=0;i<10;i++) {
try {
Object val = boundedBuffer.take();
int a =Integer.parseInt(String.valueOf(val));
System.out.println(Thread.currentThread()+" 消费者消费:"+(a+1));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
BoundedBuffer boundedBuffer = new BoundedBuffer();
Put put =new Put(boundedBuffer);
Get get = new Get(boundedBuffer);
Thread p0 =new Thread(put);
Thread c1 =new Thread(get);
Thread p2 =new Thread(get);
Thread c3 =new Thread(get);
p0.start();
c1.start();
p2.start();
c3.start();
}
}