成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
當我們講到線程池優先級的時候,我們首先會想到線程的優先級,所以按照慣性思考,當面試官問到如何使用實現優先級線程池時,我們首先會考慮是不是在創建線程池的時候,可以通過某種方法來創建不同的線程優先級,從而實現優先級線程池?這就是開頭我們一上來就講線程工廠的原因。

我們知道,線程池中的所有線程都是由統一的線程工廠來創建的,當我們指定線程工廠時,線程池中的所有線程會使用我們指定的線程工廠來創建線程;但如果沒有指定線程工廠,則會使用默認的線程工廠 DefaultThreadFactory 來創建線程,核心源碼如下:

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

那么問題來了,面試官問的是“如何實現優先級線程池?”,為什么我們一上來先講了線程工廠呢?

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

那在線程工廠中如何設置線程的優先級呢?

它的設置也比較簡單,如下代碼所示:

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;
        }
    }
}

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

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

轉念一想,既然不能在線程優先級上下功夫,但我們是否可以在線程池的任務隊列上動點心思呢?

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

所以,有時候一條路走不通的時候,我們可以嘗試換一個思路再試試。

2.優先級隊列使用

我們先來測試一下 PriorityBlockingQueue 的使用,以嘗試其可行性,示例代碼如下:

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);
        }
    }
}

以上程序的執行結果如下:

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

3.優先級線程池

因此,我們實現的優先級線程池的最終代碼如下:

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);
        }
    }
}

以上程序執行結果如下:

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

責任編輯:姜華 來源: Java中文社群
相關推薦

2024-11-11 00:00:01

線程池工具

2013-08-27 14:04:29

2022-09-13 07:50:26

小米面試官MySQL

2023-07-28 07:18:39

final繼承結構

2025-05-20 08:35:00

2012-02-27 10:03:19

小米雷軍小米之家

2009-08-28 17:10:59

C#線程優先級

2022-06-02 09:29:55

線程組線程樹狀結構

2010-03-18 14:09:20

Java線程同步

2025-02-03 08:23:33

2012-08-14 09:38:29

WAN優化

2020-09-30 09:07:37

DevOps

2020-06-04 08:36:55

Linux內核線程

2022-12-23 09:41:14

優先級反轉

2015-06-02 11:26:29

產品團隊

2023-06-30 19:44:56

CPU調頻線程

2024-09-09 15:09:30

2010-09-13 17:30:07

CSS優先級

2010-08-31 11:04:48

CSS優先級

2010-09-01 14:10:36

CSS優先級
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 福利视频一区二区 | 蜜桃精品视频在线 | 亚洲伊人久久综合 | 国产主播第一页 | 欧美xxxx性xxxxx高清 | 国产成人久久久 | 欧美一区二区三区在线播放 | 色婷婷综合久久久久中文一区二区 | av网站在线免费观看 | 欧美激情国产日韩精品一区18 | 狠狠骚 | 三级黄视频在线观看 | 免费99精品国产自在在线 | 9191av| 免费99视频 | 国产成人精品一区二区三区四区 | www.99热 | 日韩精品影院 | 成人精品国产一区二区4080 | 久久久久国产精品一区 | 美女久久久久久久久 | 精品国产伦一区二区三区观看方式 | 亚洲成人免费观看 | 黑人精品欧美一区二区蜜桃 | 久久久久久久久久久一区二区 | 精品福利视频一区二区三区 | 中文字幕av色| 欧美 日韩 国产 成人 在线 | 久久久久网站 | 久久久久久久久久久久91 | 日韩成人在线免费视频 | 精品网| 国产亚洲第一页 | 成人黄色电影免费 | av看片网站 | 日韩激情在线 | 亚洲不卡在线观看 | 欧美日韩中文字幕在线 | 91看片官网| 三级av免费| 亚洲一区二区av |