我阿里笔试零分,所以面试期间又加了一次笔试,用伯乐在线测评做的。
题目描述
生产者消费者模型。
要求:消费线程5个,生成线程5个,消费队列有界,消费队列满时,生产者暂停,否则继续生成。
解法
《java编程思想》上有生产者消费者模型的范例代码,并且完完全全符合这道题的“消费队列有界”的要求,而且还很简洁易懂。我就照搬了。
它用的是阻塞队列BlockingQueue,可以指定队列的容量。它的源码用到了ReentrantLock。可以实现:当队列满了的时候put()会阻塞,等着直到有空位;当队列空的时候take()也会阻塞,等着直到有元素可以取出。
我庆幸虽然《java编程思想》这本书很难看但我还是看了一部分,刚好就派上用场了!
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
//要求:消费线程5个,生成线程5个,消费队列有界,消费队列满时,生产者暂停,否则继续生成。
public class ProducerConsumer {
//BlockingQueue当队列满了的时候put()会阻塞。当队列空的时候take()会阻塞.故用BlockingQueue可实现题目说的消费队列有界。
private static final int CAPACITY = 3;
private static BlockingQueue<String> que = new ArrayBlockingQueue<String>(CAPACITY);
private static class Provider extends Thread{
public void run() {
try {
que.put("product");
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("produce...");
}
}
private static class Consumer extends Thread{
public void run() {
try {
que.take();
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("consume...");
}
}
public static void main(String[] args) {
for(int i = 0;i<5;i++) {
Provider prov = new Provider();
prov.start();
}
for(int i = 0;i<5;i++) {
Consumer cons = new Consumer();
cons.start();
}
System.out.println("finish");
}
}