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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多个for语句嵌套执行顺序_阿里真实面试题解析之实现多个线程顺序执行的几种方式...

發(fā)布時間:2024/7/23 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多个for语句嵌套执行顺序_阿里真实面试题解析之实现多个线程顺序执行的几种方式... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前幾天有一位同事在阿里一面的時候被問到這么一個多線程問題:如何保證多個線程的順序執(zhí)行。當時他沒有回答上來,所以為了避免大家以后遇到同樣的面試題還是回答不上來,今天我們就來分析解答下這個問題。

問題緣由

由于線程執(zhí)行是靠CPU分時間片來處理的,那么多個線程執(zhí)行的時候,如果不加限制,那么線程的執(zhí)行順序是無法保證的。如下源碼:

public class OrderThreadMain { public static void main(String[] args) { Thread A = new Thread(()->{ System.out.println("A"); }); Thread B = new Thread(()->{ System.out.println("B"); }); Thread C = new Thread(()->{ System.out.println("C"); }); A.start(); B.start(); C.start(); }}

A B C三個線程同時啟動,最后的執(zhí)行結果不是每次都順序輸出 A B C,而是每次運行結果都是不一樣的。有可能輸出A B C,有也可能輸出 B A C,是無法保證線程的順序執(zhí)行的。

join方式實現

join方式即使用Thread.join方法來實現。Thread.join含義當前線程需要等待previousThread線程終止之后才從thread.join返回。簡單來說,就是線程沒有執(zhí)行完之前,會一直阻塞在join方法處。

join方式實現方式存在兩種:主線程join和執(zhí)行線程join。下面我們依次來分析一下:

1.主線程join

public class OrderThreadMain { public static void main(String[] args) throws InterruptedException { Thread A = new Thread(()->{ System.out.println("A"); }); Thread B = new Thread(()->{ System.out.println("B"); }); Thread C = new Thread(()->{ System.out.println("C"); }); A.start(); //等待A線程執(zhí)行完在啟動B線程 A.join(); B.start(); //等待B線程執(zhí)行完在啟動C線程 B.join(); C.start(); C.join(); }}//輸出結果://A //B//C

上面源碼就是主線程join的實現方式,其原理就是保證執(zhí)行線程執(zhí)行完畢再start后續(xù)線程,從而實現多個線程的順序執(zhí)行。

2.執(zhí)行線程join

package com.example.demo.concurrent;import java.util.concurrent.Executors;public class OrderThreadMain { static class TestThread extends Thread{ private Thread beforeThread; private String str; TestThread(Thread beforeThread, String str){ this.beforeThread = beforeThread; this.str = str; } @Override public void run() { if (beforeThread != null){ try { beforeThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(str); } } public static void main(String[] args) { TestThread A = new TestThread(null, "A"); TestThread B = new TestThread(A, "B"); TestThread C = new TestThread(B, "C"); A.start(); B.start(); C.start(); }}//輸出結果://A //B//C

上面源碼就是執(zhí)行線程join的實現方式,其原理就是通過傳入beforeThread(在這個線程執(zhí)行前需要執(zhí)行完的線程對象)來保證多個線程順序執(zhí)行。

Thread.join源碼實現:

public final void join() throws InterruptedException { 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) { //一直輪訓線程是否執(zhí)行完畢,執(zhí)行完畢則結束,執(zhí)行未完畢一直輪訓 while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }

由Thread.join源碼可以知道,Thread.join原理其實很簡單,就是如果線程還未執(zhí)行完成就一直輪訓等待,執(zhí)行完成則結束輪訓,繼續(xù)執(zhí)行后續(xù)代碼。

Executors.newSingleThreadExecutor方式實現

Executors.newSingleThreadExecutor是一種特殊的線程池實現,它是一個單線程的線程池,核心線程數和最大線程數都為1,相當于串行執(zhí)行,所以可以通過它來實現多個線程順序執(zhí)行。

注:如果大家對線程池不是很了解可以閱讀作者之前一篇關于線程池的文章:

阿里P8大佬總結:Java線程池詳解,看了你就懂

public class OrderThreadMain { public static void main(String[] args) { Runnable A = new Runnable() { @Override public void run() { System.out.println("A"); } }; Runnable B = new Runnable() { @Override public void run() { System.out.println("B"); } }; Runnable C = new Runnable() { @Override public void run() { System.out.println("C"); } }; ExecutorService executorService = Executors.newSingleThreadExecutor(); //按順序提交任務 可以保證多個線程按提交順序執(zhí)行 executorService.submit(A); executorService.submit(B); executorService.submit(C); }}//輸出結果://A //B//C

上面源碼就是Executors.newSingleThreadExecutor的實現方式,只要保證任務時按順序提交,那么就能保證多個線程任務的順序執(zhí)行。

END

筆者是一位熱愛互聯網、熱愛互聯網技術、熱于分享的年輕人,如果您跟我一樣,我愿意成為您的朋友,分享每一個有價值的知識給您。喜歡作者的同學,點贊+轉發(fā)+關注哦!

點贊+轉發(fā)+關注,私信作者“讀書筆記”即可獲得BAT大廠面試資料、高級架構師VIP視頻課程等高質量技術資料。

BAT等一線互聯網面試資料和VIP高級架構師視頻

總結

以上是生活随笔為你收集整理的多个for语句嵌套执行顺序_阿里真实面试题解析之实现多个线程顺序执行的几种方式...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美色影院 | 9色在线视频 | 正在播放91 | 99久久婷婷国产综合精品电影 | www99热| 亚洲欧美在线视频 | wwwxx欧美 | 大帝av | av成人在线观看 | 人妻体内射精一区二区三区 | 亚洲精品国产suv | 日本在线高清视频 | 91av国产精品| 久草福利资源 | 国产做爰全免费的视频软件 | 天天做天天操 | 美女100%露胸无遮挡 | 国产白丝精品91爽爽久久 | 日韩不卡在线视频 | 嫩草研究院在线观看 | 激情开心站 | 久久国产精品99久久人人澡 | 深夜精品福利 | 在线观看中文字幕一区二区 | jizz在线看 | 午夜怡红院 | 超碰97色 | 人人爱人人插 | 亚洲精品在线免费播放 | 麻豆成人精品 | 可以免费看黄的网站 | a一级免费视频 | 黄色成人在线播放 | 伊人网av在线 | 亚洲精品久久久久久久蜜桃臀 | 亚洲精品乱 | 人人综合网 | 黄色另类小说 | 一级一级黄色片 | 久久久久久免费精品 | 麻豆传媒网站入口 | av网页在线| 久久久久久久影院 | 国产综合视频一区 | 日本人极品人妖高潮 | 欧美精品啪啪 | 神马午夜精品 | 久久精品亚洲精品国产欧美 | 五月天婷婷色综合 | 三级做爰在线观看视频 | 自拍偷拍福利视频 | 国产高中女学生第一次 | 男生操女生动漫 | 极品白嫩丰满美女无套 | 欧美另类xxxx野战 | 男同av在线观看一区二区三区 | 91精品国产高清91久久久久久 | 无码人妻精品一区二区中文 | 色香欲综合网 | 天天摸日日摸狠狠添 | 久久无码精品丰满人妻 | www.xxxxx日本| 一区二区乱子伦在线播放 | 91插插插插插插插插 | 天天干天天摸 | 国产一级在线观看视频 | 久草影视网 | 超碰免费公开 | 男女无遮挡网站 | 欧美mv日韩mv国产网站app | 一区二区在线免费观看视频 | 国产伦精品一区二区三区四区 | 亚洲精品乱码久久久久久写真 | 一区二区三区网 | 人人澡人人插 | 调教在线观看 | 激情视频免费在线观看 | 69re视频| 精品777| 色天天天 | 青青视频免费观看 | 国产91成人 | 色xxxxxx| 日韩亚洲精品在线 | 8x8ⅹ国产精品一区二区二区 | 精品久久久久成人码免费动漫 | 精品国偷自产国产一区 | 国产免费一区二区三区三州老师 | 日日夜夜av| 一区二区 中文字幕 | 一区二区午夜 | 亚洲欧美日韩国产 | 韩国一区视频 | av先锋资源网 | 亚洲综合五月天 | gogo人体做爰aaaa | 国产xxxx做受视频 | 91一区二区三区四区 | 色男人影院 |