控制多執行緒執行順序
- 2019 年 10 月 5 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_37933685/article/details/83619945
個人部落格:https://suveng.github.io/blog/
控制多執行緒的執行順序
示例程式碼的碼雲地址:https://gitee.com/suwenguang/test/blob/master/fuxi/src/main/java/多執行緒/控制多執行緒的順序執行/App.java
多執行緒是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。執行緒是在同一時間需要完成多項任務的時候實現的。
我們在運行多執行緒的程式時,假設執行緒逐一啟動的,但是發現執行緒的執行並不是逐一執行的。這是因為CPU隨機調度的問題,誰分配到CPU誰就執行,如果好奇進程調度演算法可以自行Google。
大概的思路可以這樣子理一下:
程式啟動->CPU分配記憶體給Java進程->Java進程的程式建立執行緒->進程分配執行緒空間->執行緒隨機獲取CPU執行->執行緒結束->主執行緒結束,進程銷毀
這裡關鍵是執行緒是隨機獲取CPU執行的
想要控制執行緒的執行順序應該怎麼做?
- 使用join()方法
- 使用SingleThreadExecutor執行緒池
使用join()方法
public void joinTest() throws InterruptedException { // 通過join() 方法保證執行緒的順序,但是這樣子就和單執行緒沒什麼區別了。 // join()是讓主執行緒等待子執行緒結束後 繼續運行 thread1.start(); thread1.join(); thread2.start(); thread2.join(); thread3.start(); thread3.join(); }
join()是讓主執行緒等待子執行緒結束後,繼續運行。
使用SingleThreadExecutor執行緒池
/** * 通過singleThreadPool來控制執行緒順序,singleThreadPool是FIFO先進先出的一個執行緒池 */ @Test public void executorTest(){ executorService.submit(thread1); executorService.submit(new Runnable() { @Override public void run() { System.out.println("i am second"); } }); executorService.submit(() -> System.out.println("i am third")); executorService.submit(thread2); executorService.submit(thread3); }
其作用類似於執行緒隊列,提交任務到隊列,執行緒池負責調度,並根據先進先出的規則執行,這樣就可以保證執行緒的順序執行了。