日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PriorityBlockingQueue用法

發布時間:2025/4/9 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PriorityBlockingQueue用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘自《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;// 用于表示當前任務的執行優先級protected static List<PrioritizedTask> sequence = new ArrayList<PrioritizedTask>();public PrioritizedTask(int priority){this.priority = priority;sequence.add(this);}/*** 用于比較任務的優先級*/@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 + ")";}}/*** 該任務負責展示當前sequence中的任務與正常執行的任務進行對比以及停止線程*/ 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();} }/***負責生成任務,分別造不同級別的任務添加到執行隊列中 **/ 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個不同優先級的任務,通過隨機數來產生for (int i = 0; i < 20; i++){queue.add(new PrioritizedTask(rand.nextInt(10)));Thread.yield();}try{//20個優先級高的任務for (int i = 0; i < 10; i++){TimeUnit.MILLISECONDS.sleep(250);queue.add(new PrioritizedTask(10));}//優先級0-9的執行任務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");} } /***負責消費任務*/ 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));//此處需特別注意,需要等待所有的任務已經生成完后,再執行消費,否則,可能會看到消費并非按照優先級執行的Thread.sleep(5000);exec.execute(new PrioritizedTaskConsumer(queue));} }

?

轉載于:https://www.cnblogs.com/woniu4/p/9140899.html

總結

以上是生活随笔為你收集整理的PriorityBlockingQueue用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。