ArrayBlockingQueue 取出null值问题

记录工作中遇到的问题,同时也希望可以帮助到有需要的朋友

ArrayBlockingQueue  相关知识网上很多帖子写的很好,还有丰富的demo,就不在此一一赘述了

这周在使用 ArrayBlockingQueue  时遇到一个问题,明明往队列中放( 用的offer(String e, long timeout, TimeUnit unit) )入了数据,但是取( 用的poll(long timeout, TimeUnit unit) )值的时候取到的是null值。

周末在家写了个测试demo

public static void main(String[] args) {
		
		ArrayBlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
		
		new Thread(()->{
				try {
					for (int i = 0; i < 10; i++) {
						blockingQueue.offer(i+""+i,1,TimeUnit.SECONDS);
						System.out.println(Thread.currentThread().getName() +"-> 插入【"+i+i+"】成功");
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				} 
		},"t1").start();
		
		new Thread(()->{
			try {
				for (int i = 0; i < 10; i++) {
					TimeUnit.SECONDS.sleep(2);
					
					String take = blockingQueue.poll(1,TimeUnit.SECONDS);
					System.out.println(Thread.currentThread().getName() +"---> 取出【"+take+"】成功");
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		},"t2").start();
		
	}

问题照旧

百思不得其解,问度娘也没有相关的文章,因为ArrayList是线程不安全的,所以怀疑 ArrayBlockingQueue 有没有可能是线程不安全的,没办法,翻看源码,的确是有lock的

 这时看到了return false,想到何不 打印一下返回值看看

通过打印内容,发现了问题,之所以取出null值是 因为 offer添加没有成功!

回过头来翻看代码,原来是时间设置的有问题

线程 t2  每次循环取值前要先等待2秒钟,而线程 t1 每次执行offer插入的最大等待时长是1秒,这就导致了,队列是满的情况下,线程 t1 未能成功插入数据,所以只要让 线程 t1 每次执行offer插入的最大等待时长 大于2秒即可

修改 线程 t1 每次执行offer插入的最大等待时长为3秒,再次执行程序

可以正常的存入取出数据了

 

后话,还是太马虎,沉下心来,夯实基础

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值