摘要:線程可以驅(qū)動任務(wù),因此你需要一種描述任務(wù)的方式,這可以由接口來提供。線程調(diào)度沒有順序的,由決定。首先會按照需要創(chuàng)建足夠多的線程來執(zhí)行任務(wù)。這個程序?qū)⒃谥械乃腥蝿?wù)完成之后盡快退出。就像是線程數(shù)量為的。
線程可以驅(qū)動任務(wù),因此你需要一種描述任務(wù)的方式,這可以由Runnable接口來提供。要想定義任務(wù),只需實現(xiàn)Runnable接口并編寫run方法,使得該任務(wù)可以執(zhí)行你的命令。
public class LiftOff implements Runnable { protected int countDown = 10; private static int taskCount = 0; //id可以用來區(qū)分任務(wù)的多個實例 private final int id = taskCount++; public LiftOff(){ System.out.println("調(diào)用了無參的構(gòu)造函數(shù)"); } public LiftOff(int countDown){ this.countDown = countDown; System.out.println("調(diào)用了有參的構(gòu)造函數(shù) "+ "參數(shù)內(nèi)容為:"+countDown); } public String status(){ return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!") + "),"; } @Override public void run() { while(countDown-- > 0){ System.out.println(status()); //使當前線程從執(zhí)行狀態(tài)(運行狀態(tài))變?yōu)榭蓤?zhí)行態(tài)(就緒狀態(tài))。 //cpu會從眾多的可執(zhí)行態(tài)里選擇,也就是說, //當前也就是剛剛的那個線程還是有可能會被再次執(zhí)行到的, //并不是說一定會執(zhí)行其他線程而該線程在下一次中不會執(zhí)行到了。 Thread.yield(); } } public static void main(String[] args) { LiftOff test1 = new LiftOff(); test1.run(); System.out.println(" "); LiftOff test2 = new LiftOff(5); test2.run(); } }
將Runnable對象轉(zhuǎn)變?yōu)楣ぷ魅蝿?wù)的傳統(tǒng)方式是把它提交給一個Thread構(gòu)造器,
Thread構(gòu)造器只需要一個Runnable對象。調(diào)用Thread對象的start()方法為該線程執(zhí)行必需的初始化操作,
然后調(diào)用Runnable的run()方法,以便在這個新線程中啟動該任務(wù)。因為main()方法和LiftOff.run()是由不同
的線程執(zhí)行的,因此程序同時運行兩個方法。
線程調(diào)度沒有順序的,由CPU決定。
接下來通過java.util.concurrent包中的執(zhí)行器(Executor)將為你管理Thread對象,從而簡化了并發(fā)編程。
1:CachedThreadPool首先會按照需要創(chuàng)建足夠多的線程來執(zhí)行任務(wù)(Task)。隨著程序執(zhí)行的過程,有的線程執(zhí)行完了任務(wù),可以被重新循環(huán)使用時,才不再創(chuàng)建新的線程來執(zhí)行任務(wù)
對shutdown()方法的調(diào)用可以防止新任務(wù)被提交給這個Executor,當前線程(即驅(qū)動main()的線程)將
繼續(xù)運行在shutdown()被調(diào)用之前提交的所有任務(wù)。這個程序?qū)⒃贓xecutor中的所有任務(wù)完成之后盡快退出。
2:FixedThreadPool模式會使用一個優(yōu)先固定數(shù)目的線程來處理若干數(shù)目的任務(wù)。規(guī)定數(shù)目的線程處理所有任務(wù),一旦有線程處理完了任務(wù)就會被用來處理新的任務(wù)(如果有的話)。
最好把3換成Runtime.getRuntime().availableProcessors(),這樣能更大程度利用你的電腦CPU處理。
3:SingleThreadExecutor就像是線程數(shù)量為1的FixedThreadPool。如果多個任務(wù)被提交給SingleThreadExecutor的話,那么這些任務(wù)會被保存在一個隊列中,并且會按照任務(wù)提交的順序,一個先執(zhí)行完成再執(zhí)行另外一個線程。SingleThreadExecutor模式可以保證只有一個任務(wù)會被執(zhí)行。這種特點可以被用來處理共享資源的問題而不需要考慮同步的問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69844.html
摘要:是學習動畫很好的項目,項目代碼量比較少,也很適合新手學習。遵循了谷歌材料設(shè)計,加入了一些以上的新特性,閱讀體驗絕不遜色于官方的。架構(gòu)項目地址由谷歌工程師開發(fā),展示的材料設(shè)計,項目代碼量大,但是結(jié)構(gòu)清晰,還是很好理解的。 1.Material Animations 演示View的平移、縮放動畫,activity進入和退出動畫,界面間元素共享。是學習動畫很好的項目,項目代碼量比較少,也很適...
這兩天和朋友談到軟件測試的發(fā)展:這一行的變化確實蠻大,從開始最基礎(chǔ)的功能測試,到現(xiàn)在自動化、性能、安全乃至于以后可能出現(xiàn)的大數(shù)據(jù)測試、AI測試崗位需求逐漸增多。我也在軟件測試這行摸爬滾打了十年了,正好有朋友問我:如何快速成為互聯(lián)網(wǎng)時代優(yōu)秀的測試工程師呢?趁著最近終于有了些閑余時間,遂總結(jié)了下自動化測試的成長線路圖和職業(yè)必備技能,希望可以幫助各位少走彎路、破繭成蝶、邁向成功。 下面我來分享下自動化測...
閱讀 2896·2023-04-26 00:26
閱讀 3504·2023-04-25 14:30
閱讀 3397·2021-10-09 09:44
閱讀 3687·2021-09-28 09:35
閱讀 1873·2021-09-22 16:02
閱讀 1261·2021-09-03 10:30
閱讀 3233·2019-08-30 15:53
閱讀 2168·2019-08-30 14:07