码迷,mamicode.com
首页 > 数据库 > 详细

六、阻塞队列LinkedBlockQueue

时间:2018-12-23 20:49:35      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:dex   art   port   tst   选择   user   locking   try   耦合   

一、简介 

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

标签:dex   art   port   tst   选择   user   locking   try   耦合   

原文地址:https://www.cnblogs.com/lay2017/p/10165319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!