阻塞队列是一种基于数组实现的阻塞队列,它在构造时需要指定容量。当试图向满队列中添加元素或者从空队列中移除元素时,当前线程会被阻塞。通过阻塞队列,我们可以按以下模式来工作:工作者线程可以周期性的将中间结果放入阻塞队列中,其它线程可以取出中间结果并进行进一步操作。若工作者线程的执行比较慢(还没来得及向队列中插入元素),其他从队列中取元素的线程会等待它(试图从空队列中取元素从而阻塞);若工作者线程执行较快(试图向满队列中插入元素),则它会等待其它线程取出元素再继续执行。
—— 引自:点击打开链接
Java代码:
import java.util.concurrent.ArrayBlockingQueue;
public class BlockingQeueTest {
private int size = 20;
// 使用阻塞队列,阻塞队列是一个基于数组实现的阻塞队列,它在构造时,需要指定容量。当试图向满队列中添加元素或者从空队列中移除元素时,
// 当前线程会被阻塞。通过阻塞队列,我们可以按照以下模式来工作:生产者线程可以周期性地将一些数据放入阻塞队列中,消费者线程可以从阻塞队列中
// 取出数据进行处理。若生产者线程执行的比较慢,消费者线程会等待它(试图从空队列中取元素而阻塞);
// 若生产者线程执行的比较快(试图向满队列中插入元素),则它会等待其他线程取出元素再继续生产。
private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(size);
public static void main(String[] args) {
BlockingQeueTest test = new BlockingQeueTest();
Producer producer = test.new Producer();
Consumer consumer = test.new Consumer();
producer.start();
consumer.start();
}
class Consumer extends Thread {
@Override
public void run() {
while (true) {
try {
// 从阻塞队列中取出一个元素
queue.take();
System.out.println("队列剩余" + queue.size() + "个元素!");
} catch (Exception e) {
}
}
}
}
class Producer extends Thread {
@Override
public void run() {
while (true) {
try {
// 向阻塞队列中插入一个元素
queue.put(1);
System.out.println("队列剩余空间:" + (size - queue.size()));
} catch (Exception e) {
}
}
}
}
}