阻塞队列LinkedBlockQueue

Posted lay2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻塞队列LinkedBlockQueue相关的知识,希望对你有一定的参考价值。

一、简介 

Java提供了FIFO先进先出的阻塞队列实现,这其实是一种生产者消费者理念,可以通过阻塞队列将生产者和消费者进行解耦合。

LinkedBlockQueue是一种无界队列,但事实上它只是队列可容纳的最大值很大。通常,我们为了防止特殊情况,都会给队列设置一个边界。

JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/LinkedBlockingQueue.html

二、示例

以下示例,包括:

1)offer:向队列尾部提交元素。

offer和put很类似,但put会一直阻塞直到可用或者异常

2)poll:获取并移除队列头部元素。

poll和take类似,但take仅支持持续阻塞,poll可以选择超时时间。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class BlockQueueDemo {

    private BlockingQueue<String> userQueue = new LinkedBlockingQueue<>();

    private void offer() {
        // 每1秒钟,offer一条数据
        for (int i = 0; i < 10; i++) {
            int id = i;
            new Thread(() -> {
                userQueue.offer("user: ID=" + id);
            }).start();
            System.out.println("offered");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void poll() {
        // 每1秒钟,poll一条数据
        for (int i = 0; i < 10; i++) {
            int id = i;
            new Thread(() -> {
                String user = userQueue.poll();
                System.out.println(user);
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        BlockQueueDemo queueDemo = new BlockQueueDemo();
        queueDemo.offer();
        queueDemo.poll();
    }
}

 

以上是关于阻塞队列LinkedBlockQueue的主要内容,如果未能解决你的问题,请参考以下文章

LinkedBlockingQueue

# Java 常用代码片段

# Java 常用代码片段

Java 阻塞队列

Java 阻塞队列

Java 阻塞队列