AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

小米面試:如何實現優先級線程池?

來源: 責編: 時間:2024-05-20 17:53:42 120觀看
導讀我們知道,線程池中的所有線程都是由統一的線程工廠來創建的,當我們指定線程工廠時,線程池中的所有線程會使用我們指定的線程工廠來創建線程;但如果沒有指定線程工廠,則會使用默認的線程工廠 DefaultThreadFactory 來創建線

bID28資訊網——每日最新資訊28at.com

我們知道,線程池中的所有線程都是由統一的線程工廠來創建的,當我們指定線程工廠時,線程池中的所有線程會使用我們指定的線程工廠來創建線程;但如果沒有指定線程工廠,則會使用默認的線程工廠 DefaultThreadFactory 來創建線程,核心源碼如下:bID28資訊網——每日最新資訊28at.com

DefaultThreadFactory() {    @SuppressWarnings("removal")    SecurityManager s = System.getSecurityManager();    group = (s != null) ? s.getThreadGroup() :                          Thread.currentThread().getThreadGroup();    namePrefix = "pool-" +                  poolNumber.getAndIncrement() +                 "-thread-";}

那么問題來了,面試官問的是“如何實現優先級線程池?”,為什么我們一上來先講了線程工廠呢?bID28資訊網——每日最新資訊28at.com

這是因為,當我們講到線程池優先級的時候,我們首先會想到線程的優先級,所以按照慣性思考,當面試官問到如何使用實現優先級線程池時,我們首先會考慮是不是在創建線程池的時候,可以通過某種方法來創建不同的線程優先級,從而實現優先級線程池?這就是開頭我們一上來就講線程工廠的原因。bID28資訊網——每日最新資訊28at.com

那在線程工廠中如何設置線程的優先級呢?bID28資訊網——每日最新資訊28at.com

它的設置也比較簡單,如下代碼所示:bID28資訊網——每日最新資訊28at.com

import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class CustomThreadPoolExecutorDemo {    public static void main(String[] args) {        // 自定義線程工廠        ThreadFactory threadFactory = new CustomThreadFactory();        // 創建線程池        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 2, 0,                                                              TimeUnit.MILLISECONDS,                                                              new LinkedBlockingQueue<>(),                                                              threadFactory);        // 提交任務        executor.execute(() -> System.out.println("Task 1"));        executor.execute(() -> System.out.println("Task 2"));        // 關閉線程池        executor.shutdown();    }    static class CustomThreadFactory implements ThreadFactory {        @Override        public Thread newThread(Runnable r) {            Thread thread = new Thread(r);            // 設置線程優先級為最低優先級            thread.setPriority(Thread.MIN_PRIORITY);             return thread;        }    }}

但是這種方式也有問題,那就是線程工廠是統一的,所以即使能在線程工廠中設置線程的優先級,那么也是將整個線程池中的所有線程都設置成統一的優先級了,而不能解決咱們本文提出的問題的,那如何才能實現優先級線程池呢?bID28資訊網——每日最新資訊28at.com

1.優先級線程池實現思路

轉念一想,既然不能在線程優先級上下功夫,但我們是否可以在線程池的任務隊列上動點心思呢?bID28資訊網——每日最新資訊28at.com

此時我們想到,可以使用 PriorityBlockingQueue 優先級隊列來對任務進行排序啊(PriorityBlockingQueue 天生支持按照優先級自動排序任務的),這樣不就能保證優先級高的任務會被線程池優先獲取并執行了嘛!bID28資訊網——每日最新資訊28at.com

所以,有時候一條路走不通的時候,我們可以嘗試換一個思路再試試。bID28資訊網——每日最新資訊28at.com

2.優先級隊列使用

我們先來測試一下 PriorityBlockingQueue 的使用,以嘗試其可行性,示例代碼如下:bID28資訊網——每日最新資訊28at.com

import java.util.concurrent.PriorityBlockingQueue;public class PriorityBlockingQueueExample {    public static void main(String[] args) {        PriorityBlockingQueue<Task> priorityQueue = new PriorityBlockingQueue<>();        // 添加任務到優先級隊列        priorityQueue.add(new Task("Task 1", 1));        priorityQueue.add(new Task("Task 4", 4));        priorityQueue.add(new Task("Task 3", 3));        priorityQueue.add(new Task("Task 2", 2));        // 從優先級隊列中取出任務并執行        while (!priorityQueue.isEmpty()) {            Task task = priorityQueue.poll();            if (task != null) {                task.execute();            }        }    }    static class Task implements Comparable<Task> {        private String name;        private int priority;        public Task(String name, int priority) {            this.name = name;            this.priority = priority;        }        public void execute() {            System.out.println("Executing task: " + name);        }        @Override        public int compareTo(Task o) {            return Integer.compare(this.priority, o.priority);        }    }}

以上程序的執行結果如下:bID28資訊網——每日最新資訊28at.com

bID28資訊網——每日最新資訊28at.com

從上述結果和代碼可以看出,我們添加任務的順序是:1、4、3、2,但最終會按照優先級排隊執行的順序是:1、2、3、4,執行結果符合我們的預期,優先級高的任務先被執行了(數字越小,優先級越高)。bID28資訊網——每日最新資訊28at.com

3.優先級線程池

因此,我們實現的優先級線程池的最終代碼如下:bID28資訊網——每日最新資訊28at.com

import java.util.concurrent.BlockingQueue;import java.util.concurrent.PriorityBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class PriorityThreadPool {    public static void main(String[] args) {        BlockingQueue<Runnable> queue = new PriorityBlockingQueue<>(1000);        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1,                0, TimeUnit.SECONDS, queue        );        for (int i = 0; i < 100; i++) {            int finalI = i;            executor.execute(new PriorityTask(i, () -> {                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    throw new RuntimeException(e);                }                System.out.println("優先級:" + finalI);            }));        }    }    static class PriorityTask implements Runnable, Comparable<PriorityTask> {        private final int priority;        private final Runnable task;        public PriorityTask(int priority, Runnable task) {            this.priority = priority;            this.task = task;        }        @Override        public void run() {            task.run();        }        @Override        public int compareTo(PriorityTask other) {            // 優先級高的任務應該排在前面(數字越小優先級越大)            return Integer.compare(this.priority, other.priority);        }    }}

以上程序執行結果如下:bID28資訊網——每日最新資訊28at.com

bID28資訊網——每日最新資訊28at.com

從上述結果可以看出,線程池是完全按照優先級從高到低的順序執行的(數字越小優先級越高),如果將 compareTo 中的排序方法倒置之后,那么線程池的執行順序就完全相反了,可見使用 PriorityBlockingQueue 實現優先級線程池的效果非常顯著。bID28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-89400-0.html小米面試:如何實現優先級線程池?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Rust Tokio取消任務的幾種模式,你知道嗎?

下一篇: Python 高效編程的 15 個優秀實踐

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • 量化指標是與非:挽救被量化指標扼殺的技術團隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術總監劉新翠在WOT2023大會上的主題分享,更多精彩內容及現場PPT,請關注51CTO技術棧公眾號,發消息【WOT2023PPT】即可直接領取
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 滴滴違法違規被罰80.26億 共存在16項違法事實

    滴滴違法違規被罰80.26億 存在16項違法事實開始于2121年7月,歷經一年時間,網絡安全審查辦公室對“滴滴出行”網絡安全審查終于有了一個暫時的結束。據“網信
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現場,成為了展會的一大看點。這也是三翼鳥繼9月9日發布了行業首個一站式定制智慧家平臺后的
Top