控制多執行緒執行順序

  • 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執行的

想要控制執行緒的執行順序應該怎麼做?

  1. 使用join()方法
  2. 使用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);  }

其作用類似於執行緒隊列,提交任務到隊列,執行緒池負責調度,並根據先進先出的規則執行,這樣就可以保證執行緒的順序執行了。