<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們在日常的多執行緒開發中,可能有時會想讓每個執行緒都按照我們指定的順序來執行,而不是讓CPU隨機排程,這樣可能會讓我們在日常的開發工作中帶來不必要的麻煩。
既然有了這個需求,也就引入了本文的標題,讓執行緒按照自己指定的順序來執行。
有興趣的同學可以猜想下列程式碼可能執行的結果:
按照正常的理解思路,上面程式碼的執行順序依次應該為:t1 → t2 → t3,而實際效果則不是理想的狀態。
下圖為執行效果:
join可能對於一些同學來說並不陌生,此處我就不詳細介紹Join是什麼了,有疑問的同學可以自行baidu和google。
這裡我將直接介紹如何使用join來達到我們希望看到的效果!
這裡主要是利用Join的阻塞效果,來達到我們的使用目的。看上圖的執行結果可以得知,程式已經按照我們指定的順序執行結束了,並得到了我們想要的結果。
其實這裡可以深入的思考一下,為什麼join可以達到我們想要的效果呢?接下來我們來看下原始碼:
進入join原始碼後,首先看到的是一個傳入0引數的join方法,此處選擇繼續進入。
首先可以看到join方法是執行緒安全的,其次可以結合上圖一起看,當傳入引數為0時,會命中一個wait(0)的方法,有經驗的同學應該能直接看懂,這裡表示等待。
但是需要說明的是,這裡的等待絕對不是等待呼叫者,而是阻塞的主執行緒,t1,t2,t3只是子執行緒,當子執行緒執行完畢後,主執行緒結束等待。
這裡演示了join的工作方式,也證實了join能讓我們在程式中達到自己想要的效果。
除了join能在程式中幫助我們控制執行緒的順序外,還有另外的方式,比如我們利用執行緒池實現試一試。
Executors是JDK中java.util.concurrent包下執行緒池操作類,可以方便的為我們提供執行緒池的操作。
這裡我們使用Executors中的newSingleThreadExecutor()方法,建立一個單執行緒的執行緒池。
根據上圖可以得知,利用newSingleThreadExecutor()方法依然能夠達到我們期待的效果,其實原理很簡單,方法內部是一個基於FIFO的佇列,也就是說,當我們依次將t1,t2,t3加入佇列中時,實際在就緒狀態的只有t1這個執行緒,t2,t3則會被新增到佇列中,當t1執行完畢後,則會繼續執行佇列中的其他執行緒。
根據上面的篇幅我們得知了如何讓執行緒按照指定的方式執行,其實方法還有很多,就不一一列舉了。
在學習運運算元時,讀者知道各個運運算元之間有優先順序,瞭解運運算元的優先順序對程式幵發有很好的作用。執行緒也是如此,每個執行緒都具有優先順序,Java 虛擬機器器根據執行緒的優先順序決定執行緒的執行順序,這樣使多執行緒合理共用 CPU 資源而不會產生衝突。
在 Java 語言中,執行緒的優先順序範圍是 1~10,值必須在 1~10,否則會出現異常;優先順序的預設值為 5。優先順序較高的執行緒會被優先執行,當執行完畢,才會輪到優先順序較低的執行緒執行。如果優先順序相同,那麼就採用輪流執行的方式。
可以使用 Thread 類中的 setPriority() 方法來設定執行緒的優先順序。語法如下:
public final void setPriority(int newPriority);
如果要獲取當前執行緒的優先順序,可以直接呼叫 getPriority() 方法。語法如下:
public final int getPriority();
簡單瞭解過優先順序之後,下面通過一個簡單的例子來演示如何使用優先順序。
例 1
分別使用 Thread 類和 Runnable 介面建立執行緒,併為它們指定優先順序。
public class FirstThreadInput extends Thread { public void run() { System.out.println("呼叫FirstThreadInput類的run()重寫方法"); //輸出字串 for(int i=0;i<5;i++) { System.out.println("FirstThreadInput執行緒中i="+i); //輸出資訊 try { Thread.sleep((int) Math.random()*100); //執行緒休眠 } catch(Exception e){} } } }
(2) 建立實現 Runnable 介面的 SecondThreadInput 類,實現 run() 方法。程式碼如下:
public class SecondThreadInput implements Runnable { public void run() { System.out.println("呼叫SecondThreadInput類的run()重寫方法"); //輸出字串 for(int i=0;i<5;i++) { System.out.println("SecondThreadInput執行緒中i="+i); //輸出資訊 try { Thread.sleep((int) Math.random()*100); //執行緒休眠 } catch(Exception e){} } } }
(3) 建立 TestThreadInput 測試類,分別使用 Thread 類的子類和 Runnable 介面的物件建立執行緒,然後呼叫 setPriority() 方法將這兩個執行緒的優先順序設定為 4,最後啟動執行緒。程式碼如下:
public class TestThreadInput { public static void main(String[] args) { FirstThreadInput fti=new FirstThreadInput(); Thread sti=new Thread(new SecondThreadInput()); fti.setPriority(4); sti.setPriority(4); fti.start(); sti.start(); } }
(4) 執行上述程式碼,執行結果如下所示。
呼叫FirstThreadInput類的run()重寫方法
呼叫SecondThreadInput類的run()重寫方法
FirstThreadInput執行緒中i=0
SecondThreadInput執行緒中i=0
FirstThreadInput執行緒中i=1
FirstThreadInput執行緒中i=2
SecondThreadInput執行緒中i=1
FirstThreadInput執行緒中i=3
SecondThreadInput執行緒中i=2
FirstThreadInput執行緒中i=4
SecondThreadInput執行緒中i=3
SecondThreadInput執行緒中i=4
由於該例子將兩個執行緒的優先順序都設定為 4,因此它們互動佔用 CPU ,宏觀上處於並行執行狀態。
重新更改 ThreadInput 類的程式碼、設定優先順序。程式碼如下:
fti.setPriority(1); sti.setPriority(10);
重新執行上述程式碼,如下所示。
呼叫FirstThreadInput類的run()重寫方法
呼叫SecondThreadInput類的run()重寫方法
FirstThreadInput執行緒中i=0
SecondThreadInput執行緒中i=0
SecondThreadInput執行緒中i=1
SecondThreadInput執行緒中i=2
SecondThreadInput執行緒中i=3
SecondThreadInput執行緒中i=4
FirstThreadInput執行緒中i=1
FirstThreadInput執行緒中i=2
FirstThreadInput執行緒中i=3
FirstThreadInput執行緒中i=4
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45