Java多线程由易到难
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
線程可以驅(qū)動(dòng)任務(wù),因此你需要一種描述任務(wù)的方式,這可以由Runnable接口來提供。要想定義任務(wù),只需實(shí)現(xiàn)Runnable接口并編寫run方法,使得該任務(wù)可以執(zhí)行你的命令。
public class LiftOff implements Runnable {protected int countDown = 10;private static int taskCount = 0;//id可以用來區(qū)分任務(wù)的多個(gè)實(shí)例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ù)\n"+ "參數(shù)內(nèi)容為:"+countDown); }public String status(){return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!") + "),";}@Overridepublic void run() {while(countDown-- > 0){System.out.println(status());//使當(dāng)前線程從執(zhí)行狀態(tài)(運(yùn)行狀態(tài))變?yōu)榭蓤?zhí)行態(tài)(就緒狀態(tài))。//cpu會(huì)從眾多的可執(zhí)行態(tài)里選擇,也就是說,//當(dāng)前也就是剛剛的那個(gè)線程還是有可能會(huì)被再次執(zhí)行到的,//并不是說一定會(huì)執(zhí)行其他線程而該線程在下一次中不會(huì)執(zhí)行到了。Thread.yield();}}public static void main(String[] args) {LiftOff test1 = new LiftOff();test1.run();System.out.println("\n");LiftOff test2 = new LiftOff(5);test2.run();}}將Runnable對(duì)象轉(zhuǎn)變?yōu)楣ぷ魅蝿?wù)的傳統(tǒng)方式是把它提交給一個(gè)Thread構(gòu)造器,
Thread構(gòu)造器只需要一個(gè)Runnable對(duì)象。調(diào)用Thread對(duì)象的start()方法為該線程執(zhí)行必需的初始化操作,
然后調(diào)用Runnable的run()方法,以便在這個(gè)新線程中啟動(dòng)該任務(wù)。因?yàn)閙ain()方法和LiftOff.run()是由不同
的線程執(zhí)行的,因此程序同時(shí)運(yùn)行兩個(gè)方法。
線程調(diào)度沒有順序的,由CPU決定。
接下來通過java.util.concurrent包中的執(zhí)行器(Executor)將為你管理Thread對(duì)象,從而簡化了并發(fā)編程。
1:CachedThreadPool首先會(huì)按照需要?jiǎng)?chuàng)建足夠多的線程來執(zhí)行任務(wù)(Task)。隨著程序執(zhí)行的過程,有的線程執(zhí)行完了任務(wù),可以被重新循環(huán)使用時(shí),才不再創(chuàng)建新的線程來執(zhí)行任務(wù)
對(duì)shutdown()方法的調(diào)用可以防止新任務(wù)被提交給這個(gè)Executor,當(dāng)前線程(即驅(qū)動(dòng)main()的線程)將
繼續(xù)運(yùn)行在shutdown()被調(diào)用之前提交的所有任務(wù)。這個(gè)程序?qū)⒃贓xecutor中的所有任務(wù)完成之后盡快退出。
2:FixedThreadPool模式會(huì)使用一個(gè)優(yōu)先固定數(shù)目的線程來處理若干數(shù)目的任務(wù)。規(guī)定數(shù)目的線程處理所有任務(wù),一旦有線程處理完了任務(wù)就會(huì)被用來處理新的任務(wù)(如果有的話)。
最好把3換成Runtime.getRuntime().availableProcessors(),這樣能更大程度利用你的電腦CPU處理。
3:SingleThreadExecutor就像是線程數(shù)量為1的FixedThreadPool。如果多個(gè)任務(wù)被提交給SingleThreadExecutor的話,那么這些任務(wù)會(huì)被保存在一個(gè)隊(duì)列中,并且會(huì)按照任務(wù)提交的順序,一個(gè)先執(zhí)行完成再執(zhí)行另外一個(gè)線程。SingleThreadExecutor模式可以保證只有一個(gè)任務(wù)會(huì)被執(zhí)行。這種特點(diǎn)可以被用來處理共享資源的問題而不需要考慮同步的問題。
轉(zhuǎn)載于:https://my.oschina.net/zhangjie5201314/blog/797706
總結(jié)
以上是生活随笔為你收集整理的Java多线程由易到难的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CNN卷积神经网络误差反传推导
- 下一篇: java ini_Java读取ini文件