成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:為什么Start方法不能重復調用?而Run方法卻可以?

開發 前端
初學線程時,總是將 run 方法和 start 方法搞混,雖然二者是完全不同的兩個方法,但剛開始使用時很難分清,原因就是因為初次使用時效果貌似是一樣的.

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

初學線程時,總是將 run 方法和 start 方法搞混,雖然二者是完全不同的兩個方法,但剛開始使用時很難分清,原因就是因為初次使用時效果貌似是一樣的,如下代碼所示:

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

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

以上程序的執行結果如下:

從上述結果可以看出,二者調用之后的執行效果都是一樣,都可以成功執行任務。但是,如果在執行線程的時候,加上打印當前線程的名稱就能看出二者的不同了,如下代碼所示:

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

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

以上程序的執行結果如下:

從上述結果我們可以看出:當調用 run 方法時,其實是調用當前主程序 main 來執行方法體的;而調用 start 方法才是真正的創建一個新線程來執行任務。

區別

1run 方法和 start 方法的第一個區別是:調用 start 方法是真正開啟一個線程來執行任務,而調用 run 方法相當于執行普通方法 run,并不會開啟新線程,如下圖所示:

區別2

run 方法和 start 方法的第二個區別是:run 方法也叫做線程體,它里面包含了具體要執行的業務代碼,當調用 run 方法時,會立即執行 run 方法中的代碼(如果當前線程時間片未用完);而調用 start 方法時,是啟動一個線程并將線程的狀態設置為就緒狀態。也就是說調用 start 方法,并不會立即執行。

區別3

因為 run 方法是普通方法,而普通方法是可以被多次調用的,所以 run 方法可以被調用多次;而 start 方法是創建新線程來執行任務,因為線程只能被創建一次,所以它們的第三個區別是:run 方法可以被調用多次,而 start 方法只能被調用一次。測試代碼如下:


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

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

以上程序的執行結果如下:

從上述結果可以看出,run 方法多次調用可用正常執行,而第二次調用 start 方法時程序就報錯了,提示“IllegalThreadStateException”非法線程狀態異常。

為什么start不能被重復調用?

要找到這個問題的答案,就要查看 start 方法的實現源碼,它的源碼如下:

從 start 源碼實現的第一行,我們就可以得到問題的答案,因為 start 方法在執行時,會先判斷當前線程的狀態是不是等于 0,也就是是否為新建狀態 NEW,如果不等于新建狀態,那么就會拋出“IllegalThreadStateException”非法線程狀態異常,這就是線程的 start 方法不能被重復調用的原因。它的執行過程是:當線程調用了第一個 start 方法之后,線程的狀態就會從新建狀態 NEW,變為就緒狀態 RUNNABLE,此時再次調用 start 方法,JVM 就會判斷出當前的線程已經不等于新建狀態,從而拋出 IllegalThreadStateException 非法線程狀態異常。

總結

run 方法和 start 方法的主要區別如下:

  1. 方法性質不同:run 是一個普通方法,而 start 是開啟新線程的方法。
  2. 執行速度不同:調用 run 方法會立即執行任務,調用 start 方法是將線程的狀態改為就緒狀態,不會立即執行。
  3. 調用次數不同:run 方法可以被重復調用,而 start 方法只能被調用一次。

start 方法之所以不能被重復調用的原因是,線程的狀態是不可逆的,Thread 在 start 的實現源碼中做了判斷,如果線程不是新建狀態 NEW,則會拋出非法線程狀態異常 IllegalThreadStateException。

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2020-05-12 08:56:16

Java 線程開發

2022-09-05 15:36:47

線程方法Java

2022-01-11 06:53:23

面試重寫重載

2022-07-27 07:36:01

TCP可靠性

2022-01-06 06:58:19

Java 語言 Java 基礎

2022-07-13 07:06:47

HTTPSHTTP協議

2022-04-18 07:36:37

TimeUnit線程休眠

2022-09-20 22:27:08

事務失效public 修飾

2022-01-24 07:01:20

安全多線程版本

2020-12-30 10:04:46

userMapper接口

2019-04-08 09:37:30

國內程序員美國程序員996.ICU

2022-07-25 07:07:35

TCP客戶端服務器

2009-08-26 16:58:12

調用C# Thread

2022-01-18 06:59:50

HashMap循環底層

2022-03-02 07:36:37

池化技術Java線程池

2021-04-16 17:02:21

數組C++語言

2022-01-27 07:02:52

JavaHashMap單線程

2022-05-26 09:24:09

volatile懶漢模式

2020-12-15 07:36:12

線程Start Run

2022-08-17 07:06:14

SpringBoot配置@Value
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 操人视频在线观看 | 日韩成人在线观看 | chengrenzaixian| www.亚洲 | 日韩精品在线看 | 亚洲二区视频 | 91久久国产综合久久 | 久久久久久久综合 | 久久一区| 欧美激情va永久在线播放 | 欧美1区| 丝袜美腿一区二区三区动态图 | 亚洲伊人久久综合 | 亚洲一区二区三区在线 | 99久久精品国产一区二区三区 | 99在线免费观看视频 | 日韩一区二区三区在线视频 | 91超碰在线 | 日韩中文字幕在线视频 | h视频免费在线观看 | 一级h片 | 亚洲精品www久久久久久广东 | 成人精品国产免费网站 | 国产激情一区二区三区 | 一区二区三区四区电影视频在线观看 | 日本午夜在线视频 | 久久精品综合网 | 精品不卡 | 911影院 | 一区二区三区中文字幕 | 精品一区二区三区四区 | 亚洲 自拍 另类 欧美 丝袜 | 狠狠视频 | 欧美激情在线播放 | 亚洲国产成人精品女人久久久 | 国产精品亚洲综合 | 台湾佬久久 | 日韩视频免费看 | 精品久久影院 | 日韩精品 电影一区 亚洲 | 日本三级线观看 视频 |