欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java線程的調(diào)度與優(yōu)先級(jí)詳解

 更新時(shí)間:2022年03月02日 11:35:55   作者:小小茶花女  
這篇文章主要為大家詳細(xì)介紹了Java線程的調(diào)度與優(yōu)先級(jí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

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

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

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

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

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

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

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

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

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

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

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

示例:

1、定義一個(gè)線程執(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個(gè)線程,并設(shè)置不同的線程優(yōu)先級(jí),來(lái)執(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)先級(jí)1~10
            threads[i].setPriority(i+1);
        }
        // 啟動(dòng)線程
        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)先級(jí)為-"+threads[i].getPriority()
                    +"-機(jī)會(huì)值為-"+threads[i].getNum());
        }
    }
}

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

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

3、運(yùn)行結(jié)果:

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

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

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

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

注意:

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

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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • Springboot中依賴注入的三種方式詳解

    Springboot中依賴注入的三種方式詳解

    這篇文章主要介紹了Springboot中依賴注入的三種方式詳解,Setter Injection需要依賴@Autowired注解,使用方式與Field Injection有所不同,Field Injection時(shí)@Autowired是用在成員變量上,需要的朋友可以參考下
    2023-09-09
  • java調(diào)用Hbase報(bào)錯(cuò)解決方法

    java調(diào)用Hbase報(bào)錯(cuò)解決方法

    這篇文章主要為大家介紹了java調(diào)用Hbase報(bào)錯(cuò)解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Springboot3整合Mybatis3的完整步驟記錄

    Springboot3整合Mybatis3的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于Springboot3整合Mybatis3的完整步驟,Spring Boot和MyBatis分別是兩個(gè)功能強(qiáng)大的框架,它們的協(xié)同使用可以極大地簡(jiǎn)化數(shù)據(jù)訪問(wèn)層的開(kāi)發(fā),提高整體的開(kāi)發(fā)效率,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序

    如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序

    HTTP/HTTPS是最常見(jiàn)的協(xié)議套件之一,并且隨著智能手機(jī)的成功,它的應(yīng)用也日益廣泛,因?yàn)閷?duì)于任何公司來(lái)說(shuō),擁有一個(gè)可以被移動(dòng)設(shè)備訪問(wèn)的網(wǎng)站幾乎是必須的。下面就來(lái)看看如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序
    2021-06-06
  • spring+mybatis實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    spring+mybatis實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了spring+mybatis實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • SpringBoot集成RabbitMQ和概念介紹

    SpringBoot集成RabbitMQ和概念介紹

    這篇文章主要介紹了SpringBoot集成RabbitMQ和概念介紹,RabbitMQ即一個(gè)消息隊(duì)列,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用。更多相關(guān)內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-05-05
  • SpringBoot+easypoi實(shí)現(xiàn)數(shù)據(jù)的Excel導(dǎo)出

    SpringBoot+easypoi實(shí)現(xiàn)數(shù)據(jù)的Excel導(dǎo)出

    這篇文章主要為大家詳細(xì)介紹了SpringBoot+easypoi實(shí)現(xiàn)數(shù)據(jù)的Excel導(dǎo)出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 解析springBoot-actuator項(xiàng)目構(gòu)造中health端點(diǎn)工作原理

    解析springBoot-actuator項(xiàng)目構(gòu)造中health端點(diǎn)工作原理

    這篇文章主要介紹了springBoot-actuator中health端點(diǎn)工作原理,對(duì)spring-boot-actuator的項(xiàng)目構(gòu)造,工作原理進(jìn)行了全面的梳理,側(cè)重health健康檢查部分
    2022-02-02
  • Java并發(fā)編程volatile關(guān)鍵字的作用

    Java并發(fā)編程volatile關(guān)鍵字的作用

    這篇文章主要介紹了Java并發(fā)編程volatile關(guān)鍵字的作用,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • java模擬實(shí)現(xiàn)銀行ATM機(jī)操作

    java模擬實(shí)現(xiàn)銀行ATM機(jī)操作

    這篇文章主要為大家詳細(xì)介紹了java模擬實(shí)現(xiàn)銀行ATM機(jī)操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論