java并发队列之ArrayBlockingQueue、LinkedBlockingQueue

ArrayBlockingQueue和LinkedBlockingQueue用法上没有什么区别,所以就放在一起把。

特点:阻塞队列,ArrayBlockingQueue定义时需要给定长度(有界队列),LinkedBlockingQueue定义时可给可不给(无界队列)。put函数在超出队列长度就会阻塞,take函数在队列中无数据会阻塞。offer函数和poll函数不会发生阻塞,有返回参数。add函数在超出队列长度时会报错,remove函数可以移除指定数据。

区别:ArrayBlockingQueue在添加和取出共用一把锁,而LinkedBlockingQueue是分开的两把锁。另一个区别看就是一个底层实现是数组一个是单向链表,数组和链表的区别就是数组适合读取,插入和删除都会影响数组中其余元素,链表正好相反,适合插入删除只会影响关联的的一个元素,不适合读取,读取会重头开始读取。

应用场景:用到队列的场景基本都是这个。

代码案例:

package com.example.web.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

@RestController
public class HomeController {

    @RequestMapping("/index")
    public String index() throws Exception {
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
        //生产者
        new Thread(() ->
        {
            try {
                TimeUnit.MILLISECONDS.sleep(5000);
                System.out.println("生产者begin");
                queue.put("测试数据");
                //queue.offer("测试数据", 5, TimeUnit.SECONDS);
                System.out.println("生产者end");
            } catch (Exception ex) {
            }
        }).start();

        //消费者
        new Thread(() ->
        {
            try {
                System.out.println("消费者begin");
                //String aa = queue.take();
                String aa = queue.poll(2, TimeUnit.SECONDS);
                System.out.println("消费者end" + aa);
            } catch (Exception ex) {
            }
        }).start();

        //主线程也等待下
        TimeUnit.SECONDS.sleep(10);
        return "网站已得到响应";
    }
}

 

参考链接:

http://ifeve.com/java-blocking-queue/

https://www.cnblogs.com/liqiu/p/3630281.html

http://www.importnew.com/24055.html

 

 

 

转载于:https://my.oschina.net/uwith/blog/3056692

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值