易百教程

291、如何使用 BlockingQueue 实现生产者-消费者问题?

生产者-消费者问题可以通过以下方式使用 BlockingQueue 来解决。

import java.util.concurrent.BlockingQueue;  
import java.util.concurrent.LinkedBlockingQueue;  
import java.util.logging.Level;  
import java.util.logging.Logger;  
public class ProducerConsumerProblem {  
    public static void main(String args[]){  
     //Creating shared object  
     BlockingQueue sharedQueue = new LinkedBlockingQueue();  

     //Creating Producer and Consumer Thread  
     Thread prod = new Thread(new Producer(sharedQueue));  
     Thread cons = new Thread(new Consumer(sharedQueue));  

     //Starting producer and Consumer thread  
     prod.start();  
     cons.start();  
    }  

}  

//Producer Class in java  
class Producer implements Runnable {  

    private final BlockingQueue sharedQueue;  

    public Producer(BlockingQueue sharedQueue) {  
        this.sharedQueue = sharedQueue;  
    }  

    @Override  
    public void run() {  
        for(int i=0; i<10; i++){  
            try {  
                System.out.println("Produced: " + i);  
                sharedQueue.put(i);  
            } catch (InterruptedException ex) {  
                Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);  
            }  
        }  
    }  

}  

//Consumer Class in Java  
class Consumer implements Runnable{  

    private final BlockingQueue sharedQueue;  

    public Consumer (BlockingQueue sharedQueue) {  
        this.sharedQueue = sharedQueue;  
    }  

    @Override  
    public void run() {  
        while(true){  
            try {  
                System.out.println("Consumed: "+ sharedQueue.take());  
            } catch (InterruptedException ex) {  
                Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);  
            }  
        }  
    }  
}

运行结果:

Produced: 0
Produced: 1
Produced: 2
Produced: 3
Produced: 4
Produced: 5
Produced: 6
Produced: 7
Produced: 8
Produced: 9
Consumed: 0
Consumed: 1
Consumed: 2
Consumed: 3
Consumed: 4
Consumed: 5
Consumed: 6
Consumed: 7
Consumed: 8
Consumed: 9