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

BAT等互聯網大廠最愛問的Java多線程并發面試題匯總

開發 前端
我們必須得從 main 方法開始說起,簡單來說,你寫一段 Java 代碼,其實一般來說啟動和執行這些 Java 代碼,都必須去運行一個 main 方法對不對,而且現在比較流行這個 SpringBoot,其實 SpringBoot 也是基于 main 方法來啟動的。

大家好,今天跟大家聊聊 Java 里面的多線程并發編程,這個多線程并發編程,想必大家都是懂的,說白了,就是在代碼里開啟一個新的線程去執行一段代碼,然后那段代碼什么時候被執行完畢,你可能也不太清楚,但是他總會過一段時間之后執行完畢的。

代碼是如何被運行的?

那我們先來看看這個所謂的多線程并發編程到底是怎么個運行原理呢?

其實這個問題,我們必須得從 main 方法開始說起,簡單來說,你寫一段 Java 代碼,其實一般來說啟動和執行這些 Java 代碼,都必須去運行一個 main 方法對不對,而且現在比較流行這個 SpringBoot,其實 SpringBoot 也是基于 main 方法來啟動的。

那運行代碼的時候首先會干什么呢?其實首先他會啟動一個 JVM 進程,接著 JVM 會去加載你寫的類,然后開始運行你的 main 方法的代碼,進而運行你寫的所有其他代碼。

在運行代碼的過程中,他需要什么類就把那個類從磁盤上的代碼文件里加載到內存里就行了。

如下圖:

那么這個時候我提一個問題,大家思考一下,那就是 JVM 進程他是怎么運行 main 方法的呢?是 JVM 進程自己直接去執行 main 方法里面的代碼嗎?

當然不是了,其實所有代碼運行都得靠線程,一個進程里是可以開很多線程的,所以 JVM 進程是會有一個默認的線程,叫做 main 線程,這個 main 線程就負責運行我們的 main 方法的代碼了。

如下圖:

多線程編程是什么?

那么這個時候所謂的多線程編程是什么意思呢?更簡單了,如果你要是不開多線程,默認情況下,就是 main 線程一個線程運行你的 main 方法以及后續的所有代碼。

此時如果你要是想要開啟更多的線程同時運行別的代碼,可以用 new Thread().start() 這種代碼,直接開啟一個線程,那個線程就會同時并發的運行,運行他那部分代碼了。

注意,多線程是可以并發運行的,也就是說 main 線程和新開的 Thread 線程幾乎是同時并發運行的。

如下圖:

那么這個時候問題來了,對于你的 main 線程來說,開了一個 thread 線程去執行部分代碼。

可是問題是,你是希望等到這個 thread 線程運行結束以后給你一個返回值的,可是你又不知道這個 thread 線程什么時候運行完畢,你更不知道這個 thread 線程如何把他的返回值交給你。

也就是說,你這個 main 線程和 thread 線程之間缺少了一些控制的途徑。

如下圖:

基于 FutureTask 獲取線程返回值

所以在這種情況之下,咱們玩兒多線程并發編程就必須引入 Future 這個東西了。

這個 Future 呢,其實就代表了你對另外一個線程的控制權,當你開啟一個 thread 線程跑起來以后,你如果可以拿到一個 Future,就可以通過這個 Future 去控制那個線程。

比如說中斷那個 thread 線程的運行,比如說通過 Future 拿到那個線程的返回值,等等。

如下圖:

所以這個 Future 在我們用 Java 寫多線程并發編程的時候,是必須要掌握的,因為經常會用到!下面我們來給大家介紹一下這個 Future 在代碼中是怎么來用的!

首先,我們來寫一段用于給 thread 子線程運行的任務代碼,如下:

public class Task implements Callable<String> {

public String call() throws Exception {
// 執行一段任務代碼,然后得到一個結果,并且返回
System.out.println("模擬運行任務代碼");
// 默認任務代碼運行一共耗時了500ms
Thread.sleep(500);
String result = "模擬返回結果";
return result;
}

}

接著我們來寫一段代碼在 main 方法中用 FutureTask 開啟一個 thread 線程運行上述代碼,并且通過 Future 去拿到這個 thread 線程運行完畢代碼后返回的結果。

代碼如下:

public class FutureTaskTest {

public static void main(String[] args)
throws InterruptedException, ExecutionException {
// 基于我們自己寫的任務代碼,構建一個FutureTask,這個FutureTask說白了
// 其實也是一個任務,只不過是用這個JDK提供的FutureTask封裝了我們的任務代碼
FutureTask<String> futureTask =
new FutureTask<String>(new Task());
// 構建一個線程池,線程池里會有一個真正運行任務的線程的
ExecutorService threadPool = Executors.newFixedThreadPool(1);
// 把FutureTask任務提交到線程池里去,讓線程池里的線程運行我們的任務代碼
threadPool.submit(futureTask);

// 這個地方我們可以模擬干了一些別的事情,執行了很多別的代碼,過了一段時間
Thread.sleep(1000);

// 過了一段時間以后,線程池里的線程應該運行完畢我們提交的任務代碼了
// 此時就可以通過FutureTask來獲取到那個任務代碼運行后的結果
System.out.println(futureTask.get());
}

}

總結

通過上面的代碼,大家就可以看到,當我們用子線程運行執行的一段任務代碼時,任務代碼運行完畢后是可以返回一個值的。

然后我們只要用 FutureTask 封裝這個任務代碼,就可以在一段時間過后,通過 FutureTask 拿到這個任務代碼運行完畢后返回的值。

這是咱們 Java 多線程并發編程常用的一種編程技巧,希望大家今天能 get 到這個 Future 的妙用。

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-12-16 10:32:04

APP會員互聯網大廠用戶

2022-09-05 17:49:53

Java線程池

2022-01-05 16:45:22

互聯網裁員危機

2022-08-31 16:17:21

造芯互聯網公司大廠

2020-02-23 17:39:21

互聯網復工公司

2021-12-14 15:27:48

互聯網程序員裁員

2022-06-01 20:24:25

互聯網元宇宙大廠

2023-01-17 09:41:26

Redis接口限流

2020-07-19 10:06:02

互聯網數據技術

2022-02-24 11:05:06

互聯網加班科技

2023-03-07 08:22:34

MySQL優化器

2019-10-25 15:50:06

MySQL數據庫命令

2021-11-22 10:03:47

互聯網薪資技術

2018-08-23 09:06:18

互聯網百度面試

2023-05-02 22:38:46

JVMJVM調優

2024-06-03 08:01:20

2015-07-21 09:18:09

百度Java研發面試題

2023-01-13 18:04:03

面試題消息中間件

2019-12-11 15:45:49

互聯網數據技術

2022-07-26 09:03:50

冪等性數據狀態機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频二 | 日本欧美国产在线观看 | 亚洲精品乱码久久久久久久久久 | 中文字幕在线一区二区三区 | 欧美日韩高清免费 | 色综合一区二区三区 | 狠狠av| 人人干在线 | 欧美精品久久久久久久久久 | 国产亚洲网站 | 精品一二三区 | 成人妇女免费播放久久久 | 国产日产欧产精品精品推荐蛮挑 | 日韩中文字幕 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | www亚洲精品 | 久久不卡区| 精品中文字幕一区 | 亚洲黄色视屏 | 久久国产免费 | 日韩免费网站 | 一区二区在线 | 在线观看深夜视频 | 国产午夜精品一区二区三区嫩草 | 日韩免费网| 色综合久久天天综合网 | 久久精品国产一区二区电影 | 国产激情在线 | 人人干人人草 | jvid精品资源在线观看 | 成人污污视频 | 日韩在线视频网址 | 国产不卡在线观看 | 91久久精品 | 色中文在线 | 国产精品久久久爽爽爽麻豆色哟哟 | 免费看国产精品视频 | 国内自拍偷拍视频 | 嫩草伊人 | 亚洲人成人一区二区在线观看 | 超碰在线播 |