BlockingQueue方法有四种形式,其处理操作的方式不同,不能立即满足,但可能在将来某个时候满足:
第一种方法抛出异常
第二种方法返回特殊值(根据操作的不同,可以为null或false)
第三种在操作成功之前无限期阻塞当前线程
第四种在放弃之前仅阻塞给定的最大时间限制,设置阻塞超时时间
下表总结了这些方法:
使用阻塞队列实现多生产者-多消费者模型
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
Object produce() {
System.out.println(Thread.currentThread().getName() + "线程生产");
return "product";
}
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void consume(Object x) {
System.out.println(Thread.currentThread().getName() + "线程消费:"+ x);
}
}
class Setup {
void main() {
BlockingQueue q = new LinkedBlockingQueue(2);
Producer p1 = new Producer(q);
Producer p2 = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p1).start();
new Thread(p2).start();
new Thread(c1).start();
new Thread(c2).start();
}
}