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

「高并發」線程到底是按照怎樣的順序執行的?

開發 架構
調用Thread的start()方法啟動線程時,線程的執行順序是不確定的。也就是說,在同一個方法中,連續創建多個線程后,調用線程的start()方法的順序并不能決定線程的執行順序。

最近經常有讀者問我:冰河,線程到底是按照怎樣的順序執行的呀?為了同一回答大家的這個問題,今天我就單獨寫一篇文章吧。好了,不多說了,進入今天的正題。

一、線程的執行順序是不確定的

調用Thread的start()方法啟動線程時,線程的執行順序是不確定的。也就是說,在同一個方法中,連續創建多個線程后,調用線程的start()方法的順序并不能決定線程的執行順序。

例如,在這里,看一個簡單的示例程序,如下所示。

package io.binghe.concurrent.lab03;

/**
* @author binghe
* @version 1.0.0
* @description 線程的順序,直接調用Thread.start()方法執行不能確保線程的執行順序
*/
public class ThreadSort01 {
public static void main(String[] args){
Thread thread1 = new Thread(() -> {
System.out.println("thread1");
});
Thread thread2 = new Thread(() -> {
System.out.println("thread2");
});
Thread thread3 = new Thread(() -> {
System.out.println("thread3");
});

thread1.start();
thread2.start();
thread3.start();
}
}

在ThreadSort01類中分別創建了三個不同的線程,thread1、thread2和thread3,接下來,在程序中按照順序分別調用thread1.start()、thread2.start()和thread3.start()方法來分別啟動三個不同的線程。

那么,問題來了,線程的執行順序是否按照thread1、thread2和thread3的順序執行呢?運行ThreadSort01的main方法,結果如下所示。

thread1
thread2
thread3

再次運行時,結果如下所示。

thread1
thread3
thread2

第三次運行時,結果如下所示。

thread2
thread3
thread1

可以看到,每次運行程序時,線程的執行順序可能不同。線程的啟動順序并不能決定線程的執行順序。

二、如何確保線程的執行順序

1.確保線程執行順序的簡單示例

在實際業務場景中,有時,后啟動的線程可能需要依賴先啟動的線程執行完成才能正確地執行線程中的業務邏輯。此時,就需要確保線程的執行順序。那么如何確保線程的執行順序呢?

可以使用Thread類中的join()方法來確保線程的執行順序。例如,下面的測試代碼。

package io.binghe.concurrent.lab03;

/**
* @author binghe
* @version 1.0.0
* @description 線程的順序,Thread.join()方法能夠確保線程的執行順序
*/
public class ThreadSort02 {
public static void main(String[] args) throws InterruptedException {

Thread thread1 = new Thread(() -> {
System.out.println("thread1");
});
Thread thread2 = new Thread(() -> {
System.out.println("thread2");
});
Thread thread3 = new Thread(() -> {
System.out.println("thread3");
});

thread1.start();

//實際上讓主線程等待子線程執行完成
thread1.join();

thread2.start();
thread2.join();

thread3.start();
thread3.join();
}
}

可以看到,ThreadSot02類比ThreadSort01類,在每個線程的啟動方法下面添加了調用線程的join()方法。此時,運行ThreadSort02類,結果如下所示。

thread1
thread2
thread3

再次運行時,結果如下所示。

thread1
thread2
thread3

第三次運行時,結果如下所示。

thread1
thread2
thread3

可以看到,每次運行的結果都是相同的,所以,使用Thread的join()方法能夠保證線程的先后執行順序。

2.join方法如何確保線程的執行順序

既然Thread類的join()方法能夠確保線程的執行順序,我們就一起來看看Thread類的join()方法到底是個什么鬼。

進入Thread的join()方法,如下所示。

public final void join() throws InterruptedException {
join(0);
}

可以看到join()方法調用同類中的一個有參join()方法,并傳遞參數0。繼續跟進代碼,如下所示。

public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;

if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}

可以看到,有一個long類型參數的join()方法使用了synchroinzed修飾,說明這個方法同一時刻只能被一個實例或者方法調用。由于,傳遞的參數為0,所以,程序會進入如下代碼邏輯。

if (millis == 0) {
while (isAlive()) {
wait(0);
}
}

首先,在代碼中以while循環的方式來判斷當前線程是否已經啟動處于活躍狀態,如果已經啟動處于活躍狀態,則調用同類中的wait()方法,并傳遞參數0。繼續跟進wait()方法,如下所示。

public final native void wait(long timeout) throws InterruptedException;

可以看到,wait()方法是一個本地方法,通過JNI的方式調用JDK底層的方法來使線程等待執行完成。

需要注意的是,調用線程的wait()方法時,會使主線程處于等待狀態,等待子線程執行完成后再次向下執行。也就是說,在ThreadSort02類的main()方法中,調用子線程的join()方法,會阻塞main()方法的執行,當子線程執行完成后,main()方法會繼續向下執行,啟動第二個子線程,并執行子線程的業務邏輯,以此類推。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-02-02 11:53:44

nolock關鍵詞SQLserver

2021-05-06 16:15:12

Java代碼

2024-05-11 09:41:45

線程安全代碼

2020-12-28 08:18:55

安全代碼線程

2024-02-07 12:35:00

React并發模式concurrent

2020-05-28 18:30:59

5G網絡通信

2020-09-21 15:16:09

大數據IT技術

2021-08-02 09:01:05

MySQL 多版本并發數據庫

2018-07-13 15:15:09

2025-02-11 08:31:37

Java關鍵字安全

2024-02-22 08:00:00

SoraOpenAI

2022-08-08 08:00:00

人工智能機器學習計算機應用

2024-03-15 08:06:58

MySQLJOIN命令

2022-05-24 17:00:41

區塊鏈IT比特幣

2017-10-16 08:38:16

2018-07-30 11:27:12

云服務

2023-09-21 07:24:52

2024-06-27 08:04:39

2022-04-10 19:26:07

TypeScript類型語法

2015-10-09 11:01:07

iPhone原創鎖定
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天色综网 | 亚洲一区二区精品视频 | 欧美日韩电影一区 | jizz亚洲人 | 日本在线免费观看 | 欧美日韩在线观看视频网站 | 少妇精品亚洲一区二区成人 | 91久久精品国产91久久 | 欧美在线视频不卡 | 国产无人区一区二区三区 | 国产区在线观看 | 国产在线精品一区 | 2018国产精品 | 国产黄色在线 | a黄视频| 91毛片网| 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 国产精品福利在线 | 亚洲一区二区三区视频 | 色偷偷人人澡人人爽人人模 | 1204国产成人精品视频 | 亚洲精品久久久久久久久久久久久 | 91色站 | 夜夜爽99久久国产综合精品女不卡 | 涩涩鲁亚洲精品一区二区 | 国产精品久久久久久久久免费桃花 | 黄色片网站在线观看 | 亚洲精品久久久9婷婷中文字幕 | 天天曰夜夜操 | 国产精品视频免费观看 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 狠狠久 | 免费看片国产 | 日韩国产在线 | 久久久夜 | 日韩av三区 | 亚洲欧美中文日韩在线v日本 | 超碰av免费 | 国产精品久久久久久吹潮 | 日本一区精品 |