Java中如何讓線程按照自己指定的順序執行

我們在日常的多線程開發中,可能有時會想讓每個線程都按照我們指定的順序來運行,而不是讓CPU隨機調度,這樣可能會讓我們在日常的開發工作中帶來不必要的麻煩。既然有了這個需求,也就引入了本文的標題,讓線程按照自己指定的順序來運行。

有興趣的同學可以猜想下列代碼可能運行的結果:

在這裏插入圖片描述

按照正常的理解思路,上面代碼的執行順序依次應該爲:t1 → t2 → t3,而實際效果則不是理想的狀態。

下圖爲運行效果:

在這裏插入圖片描述

認識Join
在這裏插入圖片描述
join可能對於一些同學來說並不陌生,此處我就不詳細介紹Join是什麼了,有疑問的同學可以自行baidu和google。這裏我將直接介紹如何使用join來達到我們希望看到的效果!

在這裏插入圖片描述

這裏主要是利用Join的阻塞效果,來達到我們的使用目的。看上圖的運行結果可以得知,程序已經按照我們指定的順序執行結束了,並得到了我們想要的結果。

其實這裏可以深入的思考一下,爲什麼join可以達到我們想要的效果呢?接下來我們來看下源碼:

進入join源碼後,首先看到的是一個傳入0參數的join方法,此處選擇繼續進入。

首先可以看到join方法是線程安全的,其次可以結合上圖一起看,當傳入參數爲0時,會命中一個wait(0)的方法,有經驗的同學應該能直接看懂,這裏表示等待。但是需要說明的是,這裏的等待絕對不是等待調用者,而是阻塞的主線程,t1,t2,t3只是子線程,當子線程運行完畢後,主線程結束等待。這裏演示了join的工作方式,也證實了join能讓我們在程序中達到自己想要的效果。

在這裏插入圖片描述

除了join能在程序中幫助我們控制線程的順序外,還有另外的方式,比如我們利用線程池實現試一試。

利用Executors線程池

Executors是JDK中java.util.concurrent包下線程池操作類,可以方便的爲我們提供線程池的操作。這裏我們使用Executors中的newSingleThreadExecutor()方法,創建一個單線程的線程池。

在這裏插入圖片描述
根據上圖可以得知,利用newSingleThreadExecutor()方法依然能夠達到我們期待的效果,其實原理很簡單,方法內部是一個基於FIFO的隊列,也就是說,當我們依次將t1,t2,t3加入隊列中時,實際在就緒狀態的只有t1這個線程,t2,t3則會被添加到隊列中,當t1執行完畢後,則會繼續執行隊列中的其他線程。

本章總結:

根據上面的篇幅我們得知了如何讓線程按照指定的方式運行,其實方法還有很多,限於篇幅就不一一列舉了,本文只是希望提供給一些基礎不好的同學以一些思路。本文還有很多細節沒有講解的很清楚,大家可以根據提供的鏈接深入的學習。同時希望大家給予寶貴的意見!

參考:https://blog.csdn.net/u010185035/article/details/81172767

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章