importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classPool {private intcapacity;privateObject[] queue;private intcount;private Lock lock = newReentrantLock();private Condition prod =lock.newCondition();private Condition cons =lock.newCondition();public Pool(intcapacity) {this.capacity =capacity;
queue= newObject[capacity];
count= 0;
}public void produce(Object o) throwsInterruptedException {
lock.lock();try{while (count ==capacity) {
prod.await();
}
queue[count++] =o;
System.out.println(Thread.currentThread().getName()+ " produce " + o.toString() + ". current count: " +count);
cons.signal();
}finally{
lock.unlock();
}
}public Object consume() throwsInterruptedException {
lock.lock();try{while (count == 0) {
cons.await();
}
Object res= queue[--count];
queue[count]= null;
System.out.println(Thread.currentThread().getName()+ " consume " + res.toString() + ". current count: " +count);
prod.signal();returnres;
}finally{
lock.unlock();
}
}public static voidmain(String[] args) {
Pool pool= new Pool(10);
ExecutorService executorService=Executors.newCachedThreadPool();int cnt = 20;while (cnt-- > 0) {
executorService.execute(()->{try{
pool.produce(newObject());
}catch(InterruptedException e) {
e.printStackTrace();
}
});
executorService.execute(()->{try{
pool.consume();
}catch(InterruptedException e) {
e.printStackTrace();
}
});
}
}
}