并发编程:优先级阻塞队列

优先级阻塞队列:PriorityBlockingQueue。

先上一段小例子:

	public static void main(String[] args) throws InterruptedException {
		PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue<Task>();
		Task t1 = new Task();
		t1.setId(2);       t1.setName("我是t1");     queue.add(t1);
		Task t2 = new Task();
		t2.setId(3);       t2.setName("我是t2");     queue.add(t2);
		Task t3 = new Task();
		t3.setId(1);       t3.setName("我是t3");     queue.add(t3);
		
		System.out.println("容器:"+queue);
		System.out.println(queue.take().getId());
		System.out.println("容器:"+queue);
		System.out.println(queue.take().getId());
		System.out.println("容器:"+queue);
		System.out.println(queue.take().getId());
	}

Task的比较方式为:

	@Override 
	public int compareTo(Task task) {
		return this.id > task.id ? 1 :(this.id < task.id ? -1 : 0);
	}

运行效果截图:

容器:[Task [id=1, name=我是t3], Task [id=3, name=我是t2], Task [id=2, name=我是t1]]
1
容器:[Task [id=2, name=我是t1], Task [id=3, name=我是t2]]
2
容器:[Task [id=3, name=我是t2]]
3

问题:

排序时机:Task放入队列的顺序为:t1、t2、t3,其对应的优先级为1、2、3,然而运行效果却显示出Task在队列中的顺序为:t3、t2、t1。

        猜想:此顺序是由队列“FIFO”的基本性质决定的,该队列的优先级在最开始并没有对排序造成影响。即阻塞队列的add()方法并没有考虑优先级关系。然而,在take方法之后,队列中的元素排列明显存在了一定的顺序,即阻塞队列的排序是在队列取数据时进行的。这里也显示出一种编程思想:在元素进入队列时不去对其进行排序,将排序的任务放在取数据时进行。事实真的如此吗?我去看了一下PriorityBlockingQueue的add()和take()方法的源码,可能是能力有限,并没有找到有力证据证明上面的猜想。所以,上面的猜想仅仅是根据运行时的显示情况而得出,欢迎路过的大佬能够针对上面的猜想给出肯定或者否的有力证明(我用的JDK是1.8版本)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值