最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中為什么start方法不能重復(fù)調(diào)用而run方法可以?

 更新時(shí)間:2022年05月09日 11:39:56   作者:??Java中文社群????  
這篇文章主要介紹了Java中為什么start方法不能重復(fù)調(diào)用而run方法可以?帶著疑問一起學(xué)習(xí)下面文章的詳細(xì)內(nèi)容吧

初學(xué)線程時(shí),總是將 run 方法和 start 方法搞混,雖然二者是完全不同的兩個(gè)方法,但剛開始使用時(shí)很難分清,原因就是因?yàn)槌醮问褂脮r(shí)效果貌似是一樣的,

如下代碼所示:

public static void main(String[] args) {
    // 創(chuàng)建線程一
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("執(zhí)行線程一");
        }
    });
    // 調(diào)用 run 方法
    thread.run();

    // 創(chuàng)建線程二
    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("執(zhí)行線程二");
        }
    });
    // 調(diào)用 start 方法
    thread2.start();
}

以上程序的執(zhí)行結(jié)果如下: 

 從上述結(jié)果可以看出,二者調(diào)用之后的執(zhí)行效果都是一樣,都可以成功執(zhí)行任務(wù)。但是,如果在執(zhí)行線程的時(shí)候,加上打印當(dāng)前線程的名稱就能看出二者的不同了,

如下代碼所示:

public static void main(String[] args) {
    // 創(chuàng)建線程一
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            // 獲取到當(dāng)前執(zhí)行線程
            Thread currThread = Thread.currentThread();
            System.out.println("執(zhí)行線程一,線程名:" + currThread.getName());
        }
    });
    // 調(diào)用 run 方法
    thread.run();

    // 創(chuàng)建線程二
    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            // 獲取到當(dāng)前執(zhí)行線程
            Thread currThread = Thread.currentThread();
            System.out.println("執(zhí)行線程二,線程名:" + currThread.getName());
        }
    });
    // 調(diào)用 start 方法
    thread2.start();
}

以上程序的執(zhí)行結(jié)果如下: 

 從上述結(jié)果我們可以看出:當(dāng)調(diào)用 run 方法時(shí),其實(shí)是調(diào)用當(dāng)前主程序 main 來執(zhí)行方法體的;而調(diào)用 start 方法才是真正的創(chuàng)建一個(gè)新線程來執(zhí)行任務(wù)。

區(qū)別1

run 方法和 start 方法的第一個(gè)區(qū)別是:調(diào)用 start 方法是真正開啟一個(gè)線程來執(zhí)行任務(wù),而調(diào)用 run 方法相當(dāng)于執(zhí)行普通方法 run,并不會(huì)開啟新線程,

如下圖所示: 

區(qū)別2

run 方法和 start 方法的第二個(gè)區(qū)別是:run 方法也叫做線程體,它里面包含了具體要執(zhí)行的業(yè)務(wù)代碼,當(dāng)調(diào)用 run 方法時(shí),會(huì)立即執(zhí)行 run 方法中的代碼(如果當(dāng)前線程時(shí)間片未用完);而調(diào)用 start 方法時(shí),是啟動(dòng)一個(gè)線程并將線程的狀態(tài)設(shè)置為就緒狀態(tài)。也就是說調(diào)用 start 方法,并不會(huì)立即執(zhí)行。

區(qū)別3

因?yàn)?run 方法是普通方法,而普通方法是可以被多次調(diào)用的,所以 run 方法可以被調(diào)用多次;而 start 方法是創(chuàng)建新線程來執(zhí)行任務(wù),因?yàn)榫€程只能被創(chuàng)建一次,所以它們的第三個(gè)區(qū)別是:run 方法可以被調(diào)用多次,而 start 方法只能被調(diào)用一次。

 測(cè)試代碼如下:

// 創(chuàng)建線程一
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // 獲取到當(dāng)前執(zhí)行的線程
        Thread currThread = Thread.currentThread();
        System.out.println("執(zhí)行線程一,線程名:" + currThread.getName());
    }
});
// 調(diào)用 run 方法
thread.run();
// 多次調(diào)用 run 方法
thread.run();

// 創(chuàng)建線程二
Thread thread2 = new Thread(new Runnable() {
    @Override
    public void run() {
        // 獲取到當(dāng)前執(zhí)行的線程
        Thread currThread = Thread.currentThread();
        System.out.println("執(zhí)行線程二,線程名:" + currThread.getName());
    }
});
// 調(diào)用 start 方法
thread2.start();
// 多次調(diào)用 start 方法
thread2.start();

以上程序的執(zhí)行結(jié)果如下: 

 從上述結(jié)果可以看出,run 方法多次調(diào)用可用正常執(zhí)行,而第二次調(diào)用 start 方法時(shí)程序就報(bào)錯(cuò)了,提示“IllegalThreadStateException”非法線程狀態(tài)異常。

為什么start不能被重復(fù)調(diào)用?

要找到這個(gè)問題的答案,就要查看 start 方法的實(shí)現(xiàn)源碼,它的源碼如下: 

 從 start 源碼實(shí)現(xiàn)的第一行,我們就可以得到問題的答案,因?yàn)?start 方法在執(zhí)行時(shí),會(huì)先判斷當(dāng)前線程的狀態(tài)是不是等于 0,也就是是否為新建狀態(tài) NEW,如果不等于新建狀態(tài),那么就會(huì)拋出“IllegalThreadStateException”非法線程狀態(tài)異常,這就是線程的 start 方法不能被重復(fù)調(diào)用的原因。 它的執(zhí)行過程是:當(dāng)線程調(diào)用了第一個(gè) start 方法之后,線程的狀態(tài)就會(huì)從新建狀態(tài) NEW,變?yōu)榫途w狀態(tài) RUNNABLE,此時(shí)再次調(diào)用 start 方法,JVM 就會(huì)判斷出當(dāng)前的線程已經(jīng)不等于新建狀態(tài),從而拋出 IllegalThreadStateException 非法線程狀態(tài)異常。

總結(jié)

run 方法和 start 方法的主要區(qū)別如下:

  • 方法性質(zhì)不同:run 是一個(gè)普通方法,而 start 是開啟新線程的方法。
  • 執(zhí)行速度不同:調(diào)用 run 方法會(huì)立即執(zhí)行任務(wù),調(diào)用 start 方法是將線程的狀態(tài)改為就緒狀態(tài),不會(huì)立即執(zhí)行。
  • 調(diào)用次數(shù)不同:run 方法可以被重復(fù)調(diào)用,而 start 方法只能被調(diào)用一次。

start 方法之所以不能被重復(fù)調(diào)用的原因是,線程的狀態(tài)是不可逆的,Thread 在 start 的實(shí)現(xiàn)源碼中做了判斷,如果線程不是新建狀態(tài) NEW,則會(huì)拋出非法線程狀態(tài)異常 IllegalThreadStateException。?

到此這篇關(guān)于Java中為什么start方法不能重復(fù)調(diào)用而run方法可以?的文章就介紹到這了,更多相關(guān)start與run方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java編寫冒泡排序的完整示例

    java編寫冒泡排序的完整示例

    這篇文章主要給大家介紹了關(guān)于java編寫冒泡排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java中“==“和equals()的區(qū)別詳解

    java中“==“和equals()的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于java中“==“和equals()區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解

    Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解

    這篇文章主要介紹了Java編程實(shí)現(xiàn)快速排序及優(yōu)化代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Java 房屋租賃系統(tǒng)的實(shí)現(xiàn)流程

    Java 房屋租賃系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)房屋租賃系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 解決springboot接入springfox-swagger2遇到的一些問題

    解決springboot接入springfox-swagger2遇到的一些問題

    這篇文章主要介紹了解決springboot接入springfox-swagger2遇到的一些問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • springboot省去配置Tomcat的步驟問題

    springboot省去配置Tomcat的步驟問題

    這篇文章主要介紹了springboot省去配置Tomcat的步驟問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MAVEN3.9.x中301問題及解決方法

    MAVEN3.9.x中301問題及解決方法

    本文主要介紹了使用MAVEN3.9.x中301問題及解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • IDEA斷點(diǎn)調(diào)試,斷點(diǎn)不起作用的解決

    IDEA斷點(diǎn)調(diào)試,斷點(diǎn)不起作用的解決

    這篇文章主要介紹了IDEA斷點(diǎn)調(diào)試,斷點(diǎn)不起作用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 一文帶你探索Java中的通配符與泛型

    一文帶你探索Java中的通配符與泛型

    Java 語言中的泛型是一種強(qiáng)大的特性,它可以將類型參數(shù)化,使得代碼更具通用性和安全性,本文將深入講解 Java 通配符和泛型,有需要的小伙伴可以了解下
    2023-12-12

最新評(píng)論

额济纳旗| 沙河市| 乐至县| 虎林市| 昌黎县| 射阳县| 灌阳县| 临泽县| 南宫市| 丰宁| 广宗县| 天气| 成安县| 八宿县| 玉树县| 湘西| 兴安盟| 北安市| 鸡西市| 伊宁市| 武山县| 乌苏市| 桃江县| 东山县| 阜新市| 外汇| 习水县| 汉川市| 南平市| 安塞县| 郯城县| 肥乡县| 高唐县| 海城市| 平凉市| 锦州市| 宿松县| 久治县| 房产| 龙泉市| 宾川县|