日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

PriorityBlockingQueue用法

發(fā)布時(shí)間:2025/4/9 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PriorityBlockingQueue用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘自《Java編程思想》

package com.test.concurrency;import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit;class PrioritizedTask implements Runnable, Comparable<PrioritizedTask> {private Random rand = new Random(47);private static int counter = 0;private final int id = counter++;private final int priority;// 用于表示當(dāng)前任務(wù)的執(zhí)行優(yōu)先級(jí)protected static List<PrioritizedTask> sequence = new ArrayList<PrioritizedTask>();public PrioritizedTask(int priority){this.priority = priority;sequence.add(this);}/*** 用于比較任務(wù)的優(yōu)先級(jí)*/@Overridepublic int compareTo(PrioritizedTask o){return priority < o.priority ? 1 : (priority > o.priority ? -1 : 0);}@Overridepublic void run(){try{TimeUnit.MILLISECONDS.sleep(rand.nextInt(250));}catch (InterruptedException e){e.printStackTrace();}System.out.println(this);}@Overridepublic String toString(){return String.format("[%1$-3d]", priority) + " Task " + id;}public String summary(){return "(" + id + ":" + priority + ")";}}/*** 該任務(wù)負(fù)責(zé)展示當(dāng)前sequence中的任務(wù)與正常執(zhí)行的任務(wù)進(jìn)行對(duì)比以及停止線程*/ class EndSentinel extends PrioritizedTask {private ExecutorService exec;public EndSentinel(ExecutorService e){super(-1);exec = e;}public void run(){int count = 0;for (PrioritizedTask pt : sequence){System.out.println(pt.summary());if (++count % 5 == 0){System.out.println();}}System.out.println();System.out.println(this + " Calling shutdownNow");exec.shutdownNow();} }/***負(fù)責(zé)生成任務(wù),分別造不同級(jí)別的任務(wù)添加到執(zhí)行隊(duì)列中 **/ class PrioritizedTaskProduncer implements Runnable {private Random rand = new Random(47);private Queue<Runnable> queue;private ExecutorService exec;public PrioritizedTaskProduncer(Queue<Runnable> q, ExecutorService e){queue = q;exec = e;}@Overridepublic void run(){//20個(gè)不同優(yōu)先級(jí)的任務(wù),通過(guò)隨機(jī)數(shù)來(lái)產(chǎn)生for (int i = 0; i < 20; i++){queue.add(new PrioritizedTask(rand.nextInt(10)));Thread.yield();}try{//20個(gè)優(yōu)先級(jí)高的任務(wù)for (int i = 0; i < 10; i++){TimeUnit.MILLISECONDS.sleep(250);queue.add(new PrioritizedTask(10));}//優(yōu)先級(jí)0-9的執(zhí)行任務(wù)for (int i = 0; i < 10; i++){queue.add(new PrioritizedTask(i));}queue.add(new EndSentinel(exec));}catch (InterruptedException e){e.printStackTrace();}System.out.println("Finished PrioritizedTaskProducer");} } /***負(fù)責(zé)消費(fèi)任務(wù)*/ class PrioritizedTaskConsumer implements Runnable {private PriorityBlockingQueue<Runnable> q;public PrioritizedTaskConsumer(PriorityBlockingQueue<Runnable> q){this.q = q;}@Overridepublic void run(){try{while (!Thread.interrupted()){q.take().run();}}catch (InterruptedException e){e.printStackTrace();}System.out.println("Finished PrioritizedTaskConsumer");} }public class PriorityBlockingQueueDemo {public static void main(String[] args) throws InterruptedException{ExecutorService exec = Executors.newCachedThreadPool();PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<Runnable>();exec.execute(new PrioritizedTaskProduncer(queue, exec));//此處需特別注意,需要等待所有的任務(wù)已經(jīng)生成完后,再執(zhí)行消費(fèi),否則,可能會(huì)看到消費(fèi)并非按照優(yōu)先級(jí)執(zhí)行的Thread.sleep(5000);exec.execute(new PrioritizedTaskConsumer(queue));} }

?

轉(zhuǎn)載于:https://www.cnblogs.com/woniu4/p/9140899.html

總結(jié)

以上是生活随笔為你收集整理的PriorityBlockingQueue用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。