public class Basket{
private volatile Object obj=null;
private final Lock lock=new ReentrantLock();
private final Condition condition=lock.newCondition();
public void produce(Object obj){
lock.lock();
try{
while(this.obj!=null)
try{
condition.await();
}catch(InterruptedException e){
e.printStackTrace();
}
this.obj=obj;
this.condition.signalAll();
System.out.println("生产了一个对象:"+obj);
} finally{
lock.unlock();
}
}
public void consume(){
lock.lock();
try{
while(this.obj==null)
try{
condition.await();
} catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("消费了一个对象:"+obj);
this.obj=null;
this.condition.signalAll();
}finally{
lock.unlock();
}
}
}
测试:
public class Test {
public static void main(String[] args) {
Basket basket = new Basket();
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
ThreadLocalRandom r = ThreadLocalRandom.current();
for (int j = 0; j < 5; j++) {
int obj = r.nextInt();
basket.produce(obj);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 5; j++) {
basket.consume();
}
}
}).start();
}
}
}