问题描述:生产者生产一个产品然后放入缓冲区,消费者从缓冲区拿一个产品出来,生产一个消费一个。
一开始接触这个问题时,参考网上的教程自己写了一个简单的代码:
class Test{//测试类
public static void main(String[] args){
Producer producer = new Producer();
Consumer consumer = new Consumer();
producer.start();
consumer.start();
}
}
class Buffer{//缓冲区类
private production = 0;
private boolean avilible = false;
public synchronized void put(int value){//设置线程锁,保证生产产品的时候,消费者不会消费
while(avilible == true){
try{
wait();
}catch(Exception e){
}
}//close while
production = value;
avilible = true;
notifyAll();
}//close put()
public synchronized int get(){
while(avilible == false){
try{
wait();
}catch(Exception e){
}//close catch
}//close while
avilible = false;
notifyAll();
return production;
}//close get()
}//close class buffer
class Producer extends Thread{
Buffer buffer = new Buffer();
@Override
public void run(){
for(int i=0;i<10;i++){
buffer.put(i);
System.out.println("生产产品:"+i);
try{
sleep(50);
}catch(Exception e){}
}
}//close run()
}
class Consumer extends Thread{
Buffer buffer = new Buffer();
@Override
public void run(){
for(int i=0;i<10;i++){
int production = buffer.get();
System.out.println("消费产品:"+production);
}
}//close run()
}
按理来说是没有问题,结果运行的结果一直就是:
生产了产品 0
最后才发现有处逻辑不对,问题在于我在每个线程中都创建了一个buffer对象,这导致消费者和生产者用的不是用一个缓冲区,这个问题也是出现的很搞笑。改正代码就是让生产者消费者共用一个buffer对象。更改后的运行结果:
生产了产品:0
消费了产品:0
生产了产品:1
消费了产品:1
消费了产品:2
生产了产品:2
生产了产品:3
消费了产品:3
消费了产品:4
生产了产品:4
生产了产品:5
消费了产品:5
生产了产品:6
消费了产品:6
生产了产品:7
消费了产品:7
生产了产品:8
消费了产品:8
生产了产品:9
消费了产品:9
由于打印的地方没有加锁,所以也会有竞态的出现。以上的来源于本人的愚解。有问题或者不对的地方,欢迎大家留言交流。