进阶篇:优先级队列之PriorityBlockingQueue(十五)

    xiaoxiao2021-04-14  32

    今天我们来讲下PriorityBlockingQueue这个队列,它是一个优先级队列,什么是优先级呢?意思就是我们可以定义队列中哪个元素可以先被取出!

    它与前面介绍的LinkedBlockingQueue不同的地方就是,它是可以定义优先级的!且入队的元素必须实现Comparable接口!

    //优先级任务 class PriorityTask implements Runnable,Comparable{ private int priority; public PriorityTask( int priority ) { this.priority = priority; } @Override public void run() { System.out.println("优先级为"+priority+"的任务执行完毕!"); } @Override public int compareTo(Object arg) { PriorityTask task = (PriorityTask)arg; if(this.priority == task.priority){ return 0; } return this.priority>task.priority?1:-1; } } //为了做对比,先看一下普通队列的元素存取顺序,再看一个优先级队列 //结论:LinkedBlockingQueue采用先进先出FIFO的顺序来取元素 //PriorityBlockingQueue里的元素必须实现Comparable接口,它也是先进先出的,只是它已经根据元素的compareTo方法事先排好了序 public static void blockingQueue(final BlockingQueue<PriorityTask> queue) throws InterruptedException{ Random random = new Random(); for (int i = 0; i < 10; i++) { int priority = random.nextInt(1000); System.out.println("元素优先级:"+priority); queue.put( new PriorityTask(priority) ); } //开启线程消费队列中的任务 new Thread(new Runnable() { public void run() { while( !Thread.currentThread().isInterrupted() ){ try { //取出队列中元素 queue.take().run(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } public static void main(String[] args) throws InterruptedException, BrokenBarrierException { System.out.println("******开始测试普通阻塞队列******"); blockingQueue(new LinkedBlockingQueue<PriorityTask>()); TimeUnit.MILLISECONDS.sleep(1000); System.out.println("******开始测试优先级队列******"); blockingQueue(new PriorityBlockingQueue<PriorityTask>()); }

    看一下输出:***********************************************************************************************

    ******开始测试普通阻塞队列****** 元素优先级:938 元素优先级:320 元素优先级:955 元素优先级:160 元素优先级:105 元素优先级:97 元素优先级:74 元素优先级:21 元素优先级:496 元素优先级:653 优先级为938的任务执行完毕! 优先级为320的任务执行完毕! 优先级为955的任务执行完毕! 优先级为160的任务执行完毕! 优先级为105的任务执行完毕! 优先级为97的任务执行完毕! 优先级为74的任务执行完毕! 优先级为21的任务执行完毕! 优先级为496的任务执行完毕! 优先级为653的任务执行完毕! ******开始测试优先级队列****** 元素优先级:460 元素优先级:565 元素优先级:704 元素优先级:104 元素优先级:939 元素优先级:442 元素优先级:419 元素优先级:884 元素优先级:572 元素优先级:687 优先级为104的任务执行完毕! 优先级为419的任务执行完毕! 优先级为442的任务执行完毕! 优先级为460的任务执行完毕! 优先级为565的任务执行完毕! 优先级为572的任务执行完毕! 优先级为687的任务执行完毕! 优先级为704的任务执行完毕! 优先级为884的任务执行完毕! 优先级为939的任务执行完毕!

    ***********************************************************************************************************

    看输出就知道,LinkedBlockingQueue是直接遵循先进先出的顺序,元素一路从上往下被取出,而PriorityBlockingQueue则是优先级最高的元素最先被取出...

    这先都比较简单,就不用多说啥了吧....

    转载请注明原文地址: https://ju.6miu.com/read-670501.html

    最新回复(0)