偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

為什么啟動(dòng)線程不直接調(diào)用run(),而要調(diào)用start(),如果調(diào)用兩次start()方法會(huì)有什么后果

開發(fā) 前端
1位工作6年的小伙伴去某里P6一面,被問(wèn)到這樣一道面試題,說(shuō),為什么啟動(dòng)一個(gè)線程不直接調(diào)用run()方法,而要調(diào)用start()方法來(lái)啟動(dòng),如果調(diào)用兩次start()會(huì)有什么后果?

1位工作6年的小伙伴去某里P6一面,被問(wèn)到這樣一道面試題,說(shuō),為什么啟動(dòng)一個(gè)線程不直接調(diào)用run()方法,而要調(diào)用start()方法來(lái)啟動(dòng),如果調(diào)用兩次start()會(huì)有什么后果?

如果,你被問(wèn)到這樣一道面試,你能回答出來(lái)嗎?今天,我給大家來(lái)分享一下,我對(duì)這個(gè)問(wèn)題的理解。

1、run()和start()的區(qū)別

首先回答為什么啟動(dòng)線程不能直接調(diào)用run()方法,而要調(diào)用start()方法,我從以下4個(gè)方面來(lái)回答:

圖片

第1:start()方法是Java線程約定的內(nèi)置方法,能夠確保代碼在新的線程上下文中運(yùn)行。

第2:start()方法包含了觸創(chuàng)建新線程的特殊代碼邏輯。run()方法是我們自己寫的代碼,很顯然沒有這個(gè)能力。

第3:如果直接調(diào)用run()方法,那么它只是一個(gè)普通的方法調(diào)用,程序中依然只有一個(gè)主線程,并且只能順序執(zhí)行,需要等待run()方法執(zhí)行結(jié)束后才能繼續(xù)執(zhí)行后面的代碼。

第4:我們創(chuàng)建線程的目的是為了更充分地利用CPU資源,如果直接調(diào)用run()方法,就失去了創(chuàng)建線程的意義了。

2、調(diào)用兩次start()的后果

了解了run()方法和start()方法的區(qū)別,那如果調(diào)用兩次start()方法會(huì)有什么后果呢?在Java中,線程的start()方法只能被調(diào)用一次,如果第二次調(diào)用會(huì)拋出 IllegalThreadStateException,這是一種運(yùn)行時(shí)異常,多次調(diào)用 start 被認(rèn)為是編程錯(cuò)誤。

圖片

在Java中,線程的運(yùn)行狀態(tài)被定義成了5個(gè)枚舉值,分別是:

(1)新建(NEW),線程已經(jīng)創(chuàng)建好了,但是還沒有調(diào)用start()方法啟動(dòng)。

(2)就緒(RUNNABLE),這個(gè)狀態(tài)下的線程可能正在運(yùn)行,也可能還在就緒隊(duì)列里面,等待系統(tǒng)分配CPU資源。

在操作系統(tǒng)中,會(huì)額外區(qū)分一種狀態(tài)叫做RUNNING,但是從 Java API 的角度,并不能表示出來(lái)。

(3)阻塞(BLOCKED),表示線程處于等待Monitor Lock的狀態(tài)。

(4)等待(WAITING),表示線程處于條件等待狀態(tài),當(dāng)觸發(fā)條件后會(huì)喚醒。比如wait/notify等。

(5)計(jì)時(shí)等待(TIMED_WAIT),它和WAITING狀態(tài)是一樣的,只是多了一個(gè)超時(shí)條件觸發(fā)機(jī)制。

(6)終止(TERMINATED),表示線程執(zhí)行結(jié)束。

在Java API 中,影響線程運(yùn)行狀態(tài)的因素,如圖所示:

圖片

在我們第一次調(diào)用 start() 方法的時(shí)候,線程可能處于終止或者其他非 NEW的狀態(tài),再次調(diào)用start()方法的時(shí)候,相當(dāng)于讓這個(gè)正在運(yùn)行的線程重新運(yùn)行一遍。不管是從線程安全的角度來(lái)看,還是從線程本身的執(zhí)行邏輯來(lái)看,它都是不合理的。

因此,為了避免這個(gè)問(wèn)題出現(xiàn),Java會(huì)先去判斷當(dāng)前線程的運(yùn)行狀態(tài)。

好了,以上就是我對(duì)Java線程的start()方法和run()方法的理解。

責(zé)任編輯:武曉燕 來(lái)源: Tom彈架構(gòu)
相關(guān)推薦

2020-05-12 08:56:16

Java 線程開發(fā)

2022-02-15 07:03:04

start 源碼run線程

2009-08-26 16:58:12

調(diào)用C# Thread

2020-12-30 10:04:46

userMapper接口

2020-05-29 09:34:28

httphttps網(wǎng)絡(luò)協(xié)議

2020-12-15 07:36:12

線程Start Run

2024-10-16 08:38:37

TCP編號(hào)信息

2022-12-06 08:26:16

SpringAOPthis調(diào)用方法

2023-12-08 08:40:16

函數(shù)

2022-01-28 00:00:42

高并發(fā)線程順序

2024-11-21 10:38:10

2023-02-01 08:11:40

系統(tǒng)調(diào)用函數(shù)

2022-11-07 10:20:20

useEffects

2020-05-26 09:09:43

Linux 系統(tǒng)調(diào)用操作系統(tǒng)

2023-09-22 07:46:22

CPU溫度筆記本

2021-04-30 13:32:17

TCP三次握手網(wǎng)絡(luò)協(xié)議

2021-07-26 08:08:56

TCPIP網(wǎng)絡(luò)協(xié)議

2020-05-13 12:17:33

RedisC字符C語(yǔ)言

2019-07-16 16:00:31

HTTP時(shí)延服務(wù)

2023-11-29 09:19:00

WebhookURL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)