溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java線程的調(diào)度與優(yōu)先級方法

發(fā)布時間:2022-03-02 14:30:40 來源:億速云 閱讀:187 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Java線程的調(diào)度與優(yōu)先級方法的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    由于CPU的計算頻率非常高,每秒計算數(shù)十億次,因此可以將CPU的時間從毫秒的維度進行分段,每一小段叫作一個CPU時間片。

    目前操作系統(tǒng)中主流的線程調(diào)度方式是:基于CPU時間片方式進行線程調(diào)度。線程只有得到CPU時間片才能執(zhí)行指令,處于執(zhí)行狀態(tài),沒有得到時間片的線程處于就緒狀態(tài),等待系統(tǒng)分配下一個CPU時間片。由于時間片非常短,在各個線程之間快速地切換,因此表現(xiàn)出來的特征是很多個線程在“同時執(zhí)行”或者“并發(fā)執(zhí)行”。

    線程的調(diào)度模型目前主要分為兩種:分時調(diào)度模型和搶占式調(diào)度模型。

    (1) 分時調(diào)度模型:系統(tǒng)平均分配CPU的時間片,所有線程輪流占用CPU,即在時間片調(diào)度的分配上所有線程“人人平等”

    (2) 搶占式調(diào)度模型:系統(tǒng)按照線程優(yōu)先級分配CPU時間片。優(yōu)先級高的線程優(yōu)先分配CPU時間片,如果所有就緒線程的優(yōu)先級相同,那么會隨機選擇一個,優(yōu)先級高的線程獲取的CPU時間片相對多一些。

    由于目前大部分操作系統(tǒng)都是使用搶占式調(diào)度模型進行線程調(diào)度,Java的線程管理和調(diào)度是委托給操作系統(tǒng)完成的,與之相對應(yīng),Java的線程調(diào)度也是使用搶占式調(diào)度模型,因此Java的線程都有優(yōu)先級。

    在Thread類中有一個實例屬性和兩個實例方法,專門用于進行線程優(yōu)先級相關(guān)的操作。與線程優(yōu)先級相關(guān)的成員屬性為:

    // 保存Thread線程實例的優(yōu)先級,1~10之間
    private int priority;
    // 獲取線程優(yōu)先級
    public final int getPriority(){//...}
    // 設(shè)置線程優(yōu)先級
    public final void setPriority(int priority){//...}

    Thread實例的priority屬性默認是級別5,對應(yīng)的類常量是NORM_PRIORITY。優(yōu)先級最大值為10,最小值為1,Thread類中定義的三個優(yōu)先級常量如下:

     public final static int MIN_PRIORITY = 1;
     public final static int NORM_PRIORITY = 5;
     public final static int MAX_PRIORITY = 10;

    Java中使用搶占式調(diào)度模型進行線程調(diào)度。priority實例屬性的優(yōu)先級越高,線程獲得CPU時間片的機會就越多,但也不是絕對的。

    示例:

    1、定義一個線程執(zhí)行體,異步執(zhí)行:

    public class ThreadDemo extends Thread {
        private  long num = 0;
        public long getNum() {
            return num;
        }
        @Override
        public void run() {
            // 線程執(zhí)行體:死循環(huán)
           for(int i=0;;i++){
               num++;
           }
        }
    }

    2、創(chuàng)建10個線程,并設(shè)置不同的線程優(yōu)先級,來執(zhí)行線程執(zhí)行體:

    public class Main {
        public static void main(String[] args) throws InterruptedException {
            ThreadDemo[] threads = new ThreadDemo[10];
            for(int i=0;i<threads.length;i++){
                threads[i] = new ThreadDemo();
                // 設(shè)置線程優(yōu)先級1~10
                threads[i].setPriority(i+1);
            }
            // 啟動線程
            for(int i=0;i<threads.length;i++){
                threads[i].start();
            }
            // 等待線程1s
            Thread.sleep(1000);
            // 停止線程
            for(int i=0;i<threads.length;i++){
                threads[i].stop();
            }
            for(int i=0;i<threads.length;i++){
                System.out.println(threads[i].getName()
                        +"-優(yōu)先級為-"+threads[i].getPriority()
                        +"-機會值為-"+threads[i].getNum());
            }
        }
    }

    在線程的run()方法中,設(shè)置了一個沒有條件判斷表達式的for循環(huán),這是一個死循環(huán),線程啟動之后,永遠也不會退出,直到線程被停止。那么,問題來了:如何停止這10個線程呢?這里使用Thread類的stop()實例方法,該方法的作用是終止線程的執(zhí)行。

    Thread類的stop()實例方法是一個過時的方法,也是一個不安全的方法。這里的安全指的是系統(tǒng)資源(文件、網(wǎng)絡(luò)連接等)的安全&mdash;&mdash;stop()實例方法可能導(dǎo)致資源狀態(tài)不一致,或者說資源出現(xiàn)問題時很難定位。在實際開發(fā)過程中,不建議使用stop()實例方法。

    3、運行結(jié)果:

    Thread-0-優(yōu)先級為-1-機會值為-0
    Thread-1-優(yōu)先級為-2-機會值為-0
    Thread-2-優(yōu)先級為-3-機會值為-0
    Thread-3-優(yōu)先級為-4-機會值為-0
    Thread-4-優(yōu)先級為-5-機會值為-3038296
    Thread-5-優(yōu)先級為-6-機會值為-4473657
    Thread-6-優(yōu)先級為-7-機會值為-2521154868
    Thread-7-優(yōu)先級為-8-機會值為-2537430692
    Thread-8-優(yōu)先級為-9-機會值為-2708120258
    Thread-9-優(yōu)先級為-10-機會值為-2690953898

    演示示例中10個線程停下來之后,某個線程的實例屬性opportunities的值越大,就表明該線程獲得的CPU時間片越多。分析案例的執(zhí)行結(jié)果,可以得出以下結(jié)論:

    (1) 整體而言,高優(yōu)先級的線程獲得的執(zhí)行機會更多。從實例中可以看到:優(yōu)先級在5級以上的線程執(zhí)行機會明顯偏多,整體對比非常明顯。

    (2) 執(zhí)行機會的獲取具有隨機性,優(yōu)先級高的不一定獲得的機會多。比如,例子中的thread-9比thread-8優(yōu)先級高,但是thread-9所獲得的機會反而偏少。

    注意:

    (1) 線程優(yōu)先級會提示調(diào)度器優(yōu)先調(diào)度該線程,它僅僅是一個提示,調(diào)度器可以忽略它。

    (2) 如果CPU比較忙,那么優(yōu)先級高的線程會獲得更多的時間片,但是CPU閑時,優(yōu)先級幾乎沒作用。

    以上就是“Java線程的調(diào)度與優(yōu)先級方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI