java的線程是通過(guò)java.lang.Thread類來(lái)實(shí)現(xiàn)的。VM啟動(dòng)時(shí)會(huì)有一個(gè)由主方法所定義的線程。可以通過(guò)創(chuàng)建Thread的實(shí)例來(lái)創(chuàng)建新的線程盛正。每個(gè)線程都是通過(guò)某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的方法run()來(lái)完成其操作的,方法run()稱為線程體奢浑。通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程蛮艰。
在Java當(dāng)中,線程通常都有五種狀態(tài),創(chuàng)建壤蚜、就緒即寡、運(yùn)行、阻塞和死亡袜刷。
第一是創(chuàng)建狀態(tài)聪富。在生成線程對(duì)象,并沒(méi)有調(diào)用該對(duì)象的start方法著蟹,這是線程處于創(chuàng)建狀態(tài)墩蔓。
第二是就緒狀態(tài)。當(dāng)調(diào)用了線程對(duì)象的start方法之后萧豆,該線程就進(jìn)入了就緒狀態(tài)奸披,但是此時(shí)線程調(diào)度程序還沒(méi)有把該線程設(shè)置為當(dāng)前線程,此時(shí)處于就緒狀態(tài)涮雷。在線程運(yùn)行之后阵面,從等待或者睡眠中回來(lái)之后,也會(huì)處于就緒狀態(tài)洪鸭。
第三是運(yùn)行狀態(tài)样刷。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程,此時(shí)線程就進(jìn)入了運(yùn)行狀態(tài)览爵,開(kāi)始運(yùn)行run函數(shù)當(dāng)中的代碼置鼻。
第四是阻塞狀態(tài)。線程正在運(yùn)行的時(shí)候蜓竹,被暫停箕母,通常是為了等待某個(gè)時(shí)間的發(fā)生(比如說(shuō)某項(xiàng)資源就緒)之后再繼續(xù)運(yùn)行。sleep,suspend梅肤,wait等方法都可以導(dǎo)致線程阻塞司蔬。
第五是死亡狀態(tài)邑茄。如果一個(gè)線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后姨蝴,該線程就會(huì)死亡。對(duì)于已經(jīng)死亡的線程肺缕,無(wú)法再使用start方法令其進(jìn)入就緒左医。
實(shí)現(xiàn)并啟動(dòng)線程有兩種方法
1、寫(xiě)一個(gè)類繼承自Thread類同木,重寫(xiě)run方法浮梢。用start方法啟動(dòng)線程
2、寫(xiě)一個(gè)類實(shí)現(xiàn)Runnable接口彤路,實(shí)現(xiàn)run方法秕硝。用new Thread(Runnable target).start()方法來(lái)啟動(dòng)
多線程原理:相當(dāng)于玩游戲機(jī),只有一個(gè)游戲機(jī)(cpu)洲尊,可是有很多人要玩远豺,于是奈偏,start是排隊(duì)!等CPU選中你就是輪到你躯护,你就run()惊来,當(dāng)CPU的運(yùn)行的時(shí)間片執(zhí)行完,這個(gè)線程就繼續(xù)排隊(duì)棺滞,等待下一次的run()裁蚁。
調(diào)用start()后,線程會(huì)被放到等待隊(duì)列继准,等待CPU調(diào)度枉证,并不一定要馬上開(kāi)始執(zhí)行,只是將這個(gè)線程置于可動(dòng)行狀態(tài)移必。然后通過(guò)JVM刽严,線程Thread會(huì)調(diào)用run()方法,執(zhí)行本線程的線程體避凝。先調(diào)用start后調(diào)用run舞萄,這么麻煩,為了不直接調(diào)用run管削?就是為了實(shí)現(xiàn)多線程的優(yōu)點(diǎn)倒脓,沒(méi)這個(gè)start不行。
1.start()方法來(lái)啟動(dòng)線程含思,真正實(shí)現(xiàn)了多線程運(yùn)行崎弃。這時(shí)無(wú)需等待run方法體代碼執(zhí)行完畢,可以直接繼續(xù)執(zhí)行下面的代碼含潘;通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程饲做, 這時(shí)此線程是處于就緒狀態(tài), 并沒(méi)有運(yùn)行遏弱。 然后通過(guò)此Thread類調(diào)用方法run()來(lái)完成其運(yùn)行操作的盆均, 這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容漱逸, Run方法運(yùn)行結(jié)束泪姨, 此線程終止。然后CPU再調(diào)度其它線程饰抒。
2.run()方法當(dāng)作普通方法的方式調(diào)用肮砾。程序還是要順序執(zhí)行,要等待run方法體執(zhí)行完畢后袋坑,才可繼續(xù)執(zhí)行下面的代碼仗处; 程序中只有主線程——這一個(gè)線程, 其程序執(zhí)行路徑還是只有一條, 這樣就沒(méi)有達(dá)到寫(xiě)線程的目的婆誓。
記字渚:多線程就是分時(shí)利用CPU,宏觀上讓所有線程一起執(zhí)行 旷档,也叫并發(fā)