日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

线程启动语句的顺序是否决定线程的执行次序。_详细分析 Java 中启动线程的正确和错误方式

發(fā)布時間:2023/12/10 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程启动语句的顺序是否决定线程的执行次序。_详细分析 Java 中启动线程的正确和错误方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

start 方法和 run 方法的比較

代碼演示:

/** *

* start() 和 run() 的比較 *

* * @author 踏雪彡尋梅 * @version 1.0 * @date 2020/9/20 - 16:15 * @since JDK1.8 */public class StartAndRunMethod { public static void main(String[] args) { // run 方法演示 // 輸出: name: main // 說明由主線程去執(zhí)行的, 不符合新建一個線程的本意 Runnable runnable = () -> { System.out.println("name: " + Thread.currentThread().getName()); }; runnable.run(); // start 方法演示 // 輸出: name: Thread-0 // 說明新建了一個線程, 符合本意 new Thread(runnable).start(); }}復(fù)制代碼

從以上示例可以分析出以下兩點:

  • 直接使用 run 方法不會啟動一個新線程。(錯誤方式)
  • start 方法會啟動一個新線程。(正確方式)

start 方法分析

start 方法的含義以及注意事項

  • start 方法可以啟動一個新線程。 線程對象在初始化之后調(diào)用了 start 方法之后, 當前線程(通常是主線程)會請求 JVM 虛擬機如果有空閑的話來啟動一下這邊的這個新線程。 也就是說, 啟動一個新線程的本質(zhì)就是請求 JVM 來運行這個線程。 至于這個線程何時能夠運行,并不是簡單的由我們能夠決定的,而是由線程調(diào)度器去決定的。 如果它很忙,即使我們運行了 start 方法,也不一定能夠立刻的啟動線程。 所以說 srtart 方法調(diào)用之后,并不意味這個方法已經(jīng)開始運行了。它可能稍后才會運行,也很有可能很長時間都不會運行,比如說遇到了饑餓的情況。 這也就印證了有些情況下,線程 1 先掉用了 start 方法,而線程 2 后調(diào)用了 start 方法,卻發(fā)現(xiàn)線程 2 先執(zhí)行線程 1 后執(zhí)行的情況。 總結(jié): 調(diào)用 start 方法的順序并不能決定真正線程執(zhí)行的順序。 注意事項 start 方法會牽扯到兩個線程。 第一個就是主線程,因為我們必須要有一個主線程或者是其他的線程(哪怕不是主線程)來執(zhí)行這個 start 方法,第二個才是新的線程。 很多情況下會忽略掉為我們創(chuàng)建線程的這個主線程,不要誤以為調(diào)用了 start 就已經(jīng)是子線程去執(zhí)行了,這個語句其實是主線程或者說是父線程來執(zhí)行的,被執(zhí)行之后才去創(chuàng)建新線程。
  • start 方法創(chuàng)建新線程的準備工作 首先,它會讓自己處于就緒狀態(tài)。 就緒狀態(tài)指已經(jīng)獲取到除了 CPU 以外的其他資源, 如已經(jīng)設(shè)置了上下文、棧、線程狀態(tài)以及 PC(PC 是一個寄存器,PC 指向程序運行的位置) 等。 做完這些準備工作之后,就萬事俱備只欠東風(fēng)了,東風(fēng)就是 CPU 資源。 做完準備工作之后,線程才能被 JVM 或操作系統(tǒng)進一步去調(diào)度到執(zhí)行狀態(tài)等待獲取 CPU 資源,然后才會真正地進入到運行狀態(tài)執(zhí)行 run 方法中的代碼。
  • 需要注意: 不能重復(fù)的執(zhí)行 start 方法 代碼示例 /** *

    * 演示不能重復(fù)的執(zhí)行 start 方法(兩次及以上), 否則會報錯 *

    * * @author 踏雪去尋梅 * @version 1.0 * @date 2020/9/20 - 16:47 * @since JDK1.8 */ public class CantStartTwice { public static void main(String[] args) { Runnable runnable = () -> { System.out.println("name: " + Thread.currentThread().getName()); }; Thread thread = new Thread(runnable); // 輸出: name: Thread-0 thread.start(); // 輸出: 拋出 java.lang.IllegalThreadStateException // 即非法線程狀態(tài)異常(線程狀態(tài)不符合規(guī)定) thread.start(); } } 復(fù)制代碼 報錯的原因 start 一旦開始執(zhí)行,線程狀態(tài)就從最開始的 New 狀態(tài)進入到后續(xù)的狀態(tài),比如說 Runnable,然后一旦線程執(zhí)行完畢,線程就會變成終止狀態(tài),而終止狀態(tài)永遠不可能再返回回去,所以會拋出以上異常,也就是說不能回到初始狀態(tài)了。這里描述的還不夠清晰,讓我們來看看源碼能了解的更透徹。

start 方法源碼分析

源碼

public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ // 第一步, 檢查線程狀態(tài)是否為初始狀態(tài), 這里也就是上面拋出異常的原因 if (threadStatus != 0) throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started * so that it can be added to the group's list of threads * and the group's unstarted count can be decremented. */ // 第二步, 加入線程組 group.add(this); boolean started = false; try { // 第三步, 調(diào)用 start0 方法 start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } }}復(fù)制代碼

源碼中的流程

第一步: 啟動新線程時會首先檢查線程狀態(tài)是否為初始狀態(tài), 這也是以上拋出異常的原因。即以下代碼:

if (threadStatus != 0) throw new IllegalThreadStateException();復(fù)制代碼

其中 threadStatus 這個變量的注釋如下,也就是說 Java 的線程狀態(tài)最初始(還沒有啟動)的時候表示為 0:

/* Java thread status for tools, * initialized to indicate thread 'not yet started' */private volatile int threadStatus = 0;復(fù)制代碼

第二步: 將其加入線程組。即以下代碼:

group.add(this);復(fù)制代碼

第三步: 最后調(diào)用 start0() 這個 native 方法(native 代表它的代碼不是由 Java 實現(xiàn)的,而是由 C/C++ 實現(xiàn)的,具體實現(xiàn)可以在 JDK 里面看到,了解即可), 即以下代碼:

boolean started = false;try { // 第三步, 調(diào)用 start0 方法 start0(); started = true;} finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ }}復(fù)制代碼

run 方法分析

run 方法源碼分析

@Overridepublic void run() { // 傳入了 target 對象(即 Runnable 接口的實現(xiàn)), 執(zhí)行傳入的 target 對象的 run 方法 if (target != null) { target.run(); }}復(fù)制代碼

對于 run 方法的兩種情況

  • 第一種: 重寫了 Thread 類的 run 方法,Thread 的 run 方法會失效, 將會執(zhí)行重寫的 run 方法。
  • 第二種: 傳入了 target 對象(即 Runnable 接口的實現(xiàn)),執(zhí)行 Thread 的原有 run 方法然后接著執(zhí)行 target 對象的 run 方法。
  • 總結(jié): run 方法就是一個普通的方法, 上文中直接去執(zhí)行 run 方法也就是相當于我們執(zhí)行自己寫的普通方法一樣,所以它的執(zhí)行線程就是我們的主線程。 所以要想真正的啟動線程,不能直接調(diào)用 run 方法,而是要調(diào)用 start 方法,其中可以間接的調(diào)用 run 方法。


作者:踏雪欲尋梅
鏈接:https://juejin.im/post/6877152472512036877
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的线程启动语句的顺序是否决定线程的执行次序。_详细分析 Java 中启动线程的正确和错误方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产a大片 | 久久久久成人片免费观看蜜芽 | 国产在线一区视频 | 国产综合无码一区二区色蜜蜜 | xxxxx黄色片 噜噜噜噜噜色 | 国产午夜啪啪 | 国产激情对白 | 在线色站 | 麻豆亚洲av熟女国产一区二 | 久草热线 | 大奶子在线观看 | 北条麻妃二三区 | 人人人射| 日本丰满熟妇bbxbbxhd | 日日夜夜狠狠爱 | 最新啪啪网站 | 欧美日韩精品一二三区 | 午夜少妇 | 国产盗摄视频在线观看 | 色综合天天综合网天天狠天天 | 国产高清sp | 麻豆午夜 | 最新福利视频 | 四虎在线免费观看视频 | 黄色成人在线观看 | 激情婷婷综合网 | 日少妇的逼 | 国内精品视频在线播放 | 爱爱的免费视频 | 少妇熟女高潮流白浆 | 91视频免费在线 | 伊人久久大香线蕉成人综合网 | 日韩aⅴ在线观看 | 国产精品一区二区人妻喷水 | 蜜臀久久99精品久久久久久宅男 | 91av在线看 | 国产亚洲欧美在线视频 | 亚洲性图一区二区三区 | 国产在线久 | 国产三级中文字幕 | 亚洲色图丝袜美腿 | 天天综合射| 亚洲香蕉在线 | 国产51视频 | 高潮网址| 波多野结衣 在线 | 成人福利院| 成人小视频在线免费观看 | 欧美裸体xxxx | av资源中文在线 | 日韩短视频 | 两性动态视频 | 婷婷色中文网 | 欧美性潮喷xxxxx免费视频看 | 综合一区| 国产靠逼网站 | 国色天香av| 91大神视频在线播放 | 欧洲xxxxx| 国产嫩草在线 | 欧美成人免费大片 | julia在线播放88mav | 国产精品av久久久久久无 | 亚洲精品国产精品国自产网站按摩 | 国产精品精品久久久久久 | 婷婷视频一区二区三区 | 免费网站看av | 岛国裸体写真hd在线 | 福利在线电影 | 人妻精油按摩bd高清中文字幕 | 性感美女一区二区三区 | 玩偶姐姐在线观看免费 | 德国性经典xxxx性hd | 亚洲熟妇无码乱子av电影 | 涩涩精品| 亚洲日本护士毛茸茸 | 久久国产色av免费观看 | 美女毛片在线观看 | 青青草国产在线 | 日韩精品免费一区二区 | 欧美日本三级 | 黄色aa网站 | 亚洲一区二区三区电影在线观看 | 色中色在线视频 | 九色视频在线观看 | 中文天堂在线视频 | 欧美日韩亚洲一区二区三区 | 老头吃奶性行交 | 欧美一区高清 | 精品在线免费播放 | 亚州黄色| 亚州综合网| 激情小说激情视频 | 国产一级伦理片 | 麻豆tube| 中文字幕免费高清视频 | 成人自拍视频网站 | 东北少妇av | 精品国产va久久久久久久 |