在多线程技术中,有一个经典的案例,就是生产者和消费者的问题。在这个问题中,有生产者、产品、装产品的容器、消费者,他们之间有着严格的流水线控制,多个生产者可以同时生产,多个消费者也可以同时消费,而且是在生产的同时也在消费。这就涉及到线程间同步互斥的问题。下面是源代码:
class SourceBuffer{
Lock lock =new ReentrantLock();//定义一个锁
Condition notFull=lock.newCondition();
Condition notEmpty=lock.newCondition(); //在锁的基础上定义两个监视器,分别监视生产者和消费者;
object [] items=new Object[100];//申请一个数组,当做是装产品的容器,大小为100;
int putptr,takeptr,conut;
public void put(object x) throws InterruptedException{ // 生产产品的方法
lock.lock(); //此锁保证了在操作生产代码的时候,不会去操作消费代码,保证了数据的安全性
try{
while(count==items.length) //当产品数量达到上限时,停止生产,否则继续生产
notFull.await();
++count;
if(++putptr==items.length) //当数组下标到了末尾时,应该跳转到最前面的下标
putptr=0;
items[putptr]=x;
notEmpty.signal();
}
finally{
lock.unlock();
}
}
public Object put() throws InterruptedException{ //获取产品的方法
lock.lock();
try{
while(count==0)
notEmpty.await();
--count;
if(++takeptr==items.length)
takeptr=0;
Object x= items[putptr];
notFull.signal();
return x;
}
finally{
lock.unlock();
}
}