自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java并發(fā)編程:什么是線程優(yōu)先級?

開發(fā) 前端
Java只是為操作系統(tǒng)提供了一個線程優(yōu)先級的參考值。線程在操作系統(tǒng)中的最終優(yōu)先級仍然由操作系統(tǒng)決定。線程的執(zhí)行順序最終由操作系統(tǒng)中的調(diào)度器決定,線程的優(yōu)先級肯定是在線程被調(diào)用之前設置的。

線程優(yōu)先級是操作系統(tǒng)在調(diào)度線程時為每個線程分配的執(zhí)行順序優(yōu)先級。優(yōu)先級較高的線程會先于優(yōu)先級較低的線程執(zhí)行。

在Java中,線程的優(yōu)先級可以設置為1到10之間的值,默認的線程優(yōu)先級是5。

源碼:

圖片圖片

  • MIN_PRIORITY:線程的最低優(yōu)先級,值為1。
  • NORM_PRIORITY:線程的默認優(yōu)先級,值為5。
  • MAX_PRIORITY:線程的最高優(yōu)先級,值為10。

然而,并非所有操作系統(tǒng)都支持10個級別的優(yōu)先級(例如,有些操作系統(tǒng)只支持3個級別:、、)。

Java只是為操作系統(tǒng)提供了一個線程優(yōu)先級的參考值。線程在操作系統(tǒng)中的最終優(yōu)先級仍然由操作系統(tǒng)決定。

線程的執(zhí)行順序最終由操作系統(tǒng)中的調(diào)度器決定,線程的優(yōu)先級肯定是在線程被調(diào)用之前設置的。

一般來說,優(yōu)先級較高的線程比優(yōu)先級較低的線程有更高的機會被執(zhí)行。我們可以使用Thread類的setPriority()方法來設置線程的優(yōu)先級。

public class Demo {
    public static void main(String[] args) {
        Thread a = new Thread();
        System.out.println("默認線程優(yōu)先級: " + a.getPriority());
        Thread b = new Thread();
        b.setPriority(9);
        System.out.println("設置線程優(yōu)先級: " + b.getPriority());
    }
}

輸出:

默認線程優(yōu)先級: 5
設置線程優(yōu)先級: 9

為什么不推薦使用線程優(yōu)先級?

既然有1到10的級別來設置線程的優(yōu)先級,你可能會問:我可以在業(yè)務代碼中使用這個方法來指定某些線程的執(zhí)行順序嗎?

我的回答是:不行!

Java中的優(yōu)先級并不可靠,在Java程序中設置的線程優(yōu)先級只是對操作系統(tǒng)的一個建議,操作系統(tǒng)不一定會采納。實際的執(zhí)行順序由操作系統(tǒng)的線程調(diào)度算法決定。

讓我們用代碼來驗證一下:

public class TestExecuteOrder {
    staticclass MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.printf("當前執(zhí)行的線程是: %s, 優(yōu)先級: %d%n",
                    Thread.currentThread().getName(),
                    Thread.currentThread().getPriority());
        }
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        t1.setPriority(1);
        Thread t2 = new Thread(new MyRunnable());
        t2.setPriority(5);
        Thread t3 = new Thread(new MyRunnable());
        t3.setPriority(10);
        t3.start();
        t2.start();
        t1.start();
    }
}

如果按順序執(zhí)行,這個程序應該按照10、5、1的順序輸出。

但看看某個特定的輸出:

當前執(zhí)行的線程是: Thread-1, 優(yōu)先級: 5
當前執(zhí)行的線程是: Thread-2, 優(yōu)先級: 10
當前執(zhí)行的線程是: Thread-0, 優(yōu)先級: 1

優(yōu)先級為5的線程實際上在優(yōu)先級為10的線程之前輸出了結(jié)果,所以看起來這個優(yōu)先級設置確實不可靠 。

線程優(yōu)先級與線程組優(yōu)先級的關系

在前一篇文章中,我們討論過線程必須存在于一個線程組中。那么,當線程的優(yōu)先級與線程組的優(yōu)先級不同時會發(fā)生什么呢?讓我們用以下代碼來驗證:

public class ThreadGroupOrder {
    public static void main(String[] args) {
        ThreadGroup myThreadGroup = new ThreadGroup("myThreadGroup");
        myThreadGroup.setMaxPriority(6);
        Thread myThread = new Thread(myThreadGroup, "myThread");
        myThread.setPriority(8);
        System.out.println("線程組優(yōu)先級: " + myThreadGroup.getMaxPriority());
        System.out.println("線程優(yōu)先級: " + myThread.getPriority());
    }
}

輸出:

線程組優(yōu)先級: 6
線程優(yōu)先級: 6

所以,如果線程的優(yōu)先級高于它所在的線程組的優(yōu)先級,那么該線程的優(yōu)先級將失效,并被替換為線程組的最大優(yōu)先級。

責任編輯:武曉燕 來源: 程序猿技術充電站
相關推薦

2010-03-18 14:09:20

Java線程同步

2009-08-28 17:10:59

C#線程優(yōu)先級

2024-04-30 11:00:10

數(shù)據(jù)中心

2025-02-03 00:40:00

線程組Java并發(fā)編程

2012-08-14 09:38:29

WAN優(yōu)化

2020-06-04 08:36:55

Linux內(nèi)核線程

2022-12-23 09:41:14

優(yōu)先級反轉(zhuǎn)

2023-06-30 19:44:56

CPU調(diào)頻線程

2024-05-20 10:03:15

線程池優(yōu)先級隊列排序方法

2022-06-02 09:29:55

線程組線程樹狀結(jié)構(gòu)

2010-09-01 14:10:36

CSS優(yōu)先級

2010-08-31 11:04:48

CSS優(yōu)先級

2010-09-13 17:30:07

CSS優(yōu)先級

2011-12-29 13:31:15

Java

2025-02-19 00:05:18

Java并發(fā)編程

2025-02-17 00:00:25

Java并發(fā)編程

2024-12-03 00:44:50

2021-04-06 10:45:18

React前端優(yōu)先級

2020-09-30 09:07:37

DevOps

2024-04-15 08:37:35

點贊
收藏

51CTO技術棧公眾號