java多线程笔记补充之线程控制操作
線程休眠:讓執(zhí)行的線程暫停一段時(shí)間,進(jìn)入計(jì)時(shí)等待狀態(tài)。
方法:staticvoid sleep(long millis)
調(diào)用sleep后,當(dāng)前線程放棄CPU,在指定時(shí)間段之內(nèi),sleep所在線程不會(huì)獲得執(zhí)行的機(jī)會(huì)。
此狀態(tài)下的線程不會(huì)釋放同步鎖/同步監(jiān)聽器.
該方法更多的用于模擬網(wǎng)絡(luò)延遲,讓多線程并發(fā)訪問同一個(gè)資源的錯(cuò)誤效果更明顯.
在開發(fā)中也會(huì)故意使用該方法,如:
實(shí)現(xiàn):
聯(lián)合線程:
線程的join方法表示一個(gè)線程等待另一個(gè)線程完成后才執(zhí)行。join方法被調(diào)用之后,線程對(duì)象處于阻塞狀態(tài)。
有人也把這種方式稱為聯(lián)合線程,就是說把當(dāng)前線程和當(dāng)前線程所在的線程聯(lián)合成一個(gè)線程。
后臺(tái)線程:在后臺(tái)運(yùn)行的線程,其目的是為其他線程提供服務(wù),也稱為“守護(hù)線程"。JVM的垃圾回收線程就是典型的后臺(tái)線程。
特點(diǎn):若所有的前臺(tái)線程都死亡,后臺(tái)線程自動(dòng)死亡,前臺(tái)線程沒有結(jié)束,后臺(tái)線程是不會(huì)結(jié)束的。
測(cè)試線程對(duì)象是否為后臺(tái)線程:使用thread.isDaemon()。
前臺(tái)線程創(chuàng)建的線程默認(rèn)是前臺(tái)線程,可以通過setDaenon(true)方法設(shè)置為后臺(tái)線程,并且當(dāng)且僅當(dāng)后臺(tái)線程創(chuàng)建的新線程時(shí),新線程是后臺(tái)線程。
設(shè)置后臺(tái)線程:thread.setDaemon(true),該方法必須在start方法調(diào)用前,否則出現(xiàn)IllegalThreadStateException異常。
線程優(yōu)先級(jí):
每個(gè)線程都有優(yōu)先級(jí),優(yōu)先級(jí)的高低只和線程獲得執(zhí)行機(jī)會(huì)的次數(shù)多少有關(guān),并非線程優(yōu)先級(jí)越高的就一定先執(zhí)行,哪個(gè)線程的先運(yùn)行取決于CPU的調(diào)度。
MAX_PRIORITY=10,最高優(yōu)先級(jí)
MIN_PRIORITY=1,最低優(yōu)先級(jí)
NORM_PRIORITY=5,默認(rèn)優(yōu)先級(jí)
-----------------------
?int getPriority() :返回線程的優(yōu)先級(jí)。
?void setPriority(int newPriority) : 更改線程的優(yōu)先級(jí)。
-----------------------
每個(gè)線程都有默認(rèn)優(yōu)先級(jí),主線程默認(rèn)優(yōu)先級(jí)為5,如果A線程創(chuàng)建了B線程,那么B線程和A線程具有相同優(yōu)先級(jí).
注意:不同的操作系統(tǒng)支持的線程優(yōu)先級(jí)不同的,建議使用上述三個(gè)優(yōu)先級(jí),不要自定義.?
線程禮讓:
yield方法:表示當(dāng)前線程對(duì)象提示調(diào)度器自己愿意讓出CPU資源,但是調(diào)度器可以自由的忽略該提示。
調(diào)用該方法之后,線程對(duì)象進(jìn)入就緒狀態(tài),所以完全有可能:某個(gè)線程調(diào)用了yield()之后,線程調(diào)度器又把它調(diào)度出來重新執(zhí)行。
從Java7提供的文檔上可以清楚的看出,開發(fā)中很少會(huì)使用到該方法,該方法主要用于調(diào)試或測(cè)試,它可能有助于因多線程競(jìng)爭(zhēng)條件下的錯(cuò)誤重現(xiàn)現(xiàn)象。
-----------------------------------------
sleep方法和yield方法的區(qū)別:
? 1):都能使當(dāng)前處于運(yùn)行狀態(tài)的線程放棄CPU,把運(yùn)行的機(jī)會(huì)給其他線程.
? 2):sleep方法會(huì)給其他線程運(yùn)行機(jī)會(huì),但是不考慮其他線程的優(yōu)先級(jí),yield方法只會(huì)給相同優(yōu)先級(jí)或者更高優(yōu)先級(jí)的線程運(yùn)行的機(jī)會(huì).
? 3):調(diào)用sleep方法后,線程進(jìn)入計(jì)時(shí)等待狀態(tài),調(diào)用yield方法后,線程進(jìn)入就緒狀態(tài).
定時(shí)器和線程組 |
在JDK的java.util包中提供了Timer類,可以定時(shí)執(zhí)行特定的任務(wù).
TimerTask類表示定時(shí)器執(zhí)行的某一項(xiàng)任務(wù).
常用方法:
schedule(TimerTasktask,long delay,long period):
schedule(TimerTasktask,long delay):
-----------------------------------------------------------------
ThreadGroup類表示線程組,可以對(duì)一組線程進(jìn)行集中管理.
用戶在創(chuàng)建線程對(duì)象時(shí),可以通過構(gòu)造器指定其所屬的線程組.
Thread(ThreadGroupgroup,String name);
如果A線程創(chuàng)建了B線程,如果沒有設(shè)置B線程的分組,那么B線程加入到A線程的線程組.
一旦線程加入某個(gè)線程組,該線程就一直存在于該線程組中直到線程死亡,不能在中途修改線程的分組.
------------------------
當(dāng)Java程序運(yùn)行時(shí),JVM會(huì)創(chuàng)建名為main的線程組,在默認(rèn)情況下,所有的線程都該改線程組下.
線程相關(guān)的知識(shí)點(diǎn):
???? 1):線程安全的集合對(duì)象(留到集合框架中去).
???? 2):ThreadLocal:本地線程變量,ThreadLocal模式
???? 3):線程池,Java8堆線程池新增的功能.
???? 4):Java5新增的線程并發(fā)操作.
總結(jié)
以上是生活随笔為你收集整理的java多线程笔记补充之线程控制操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中预定义宏的应用
- 下一篇: 【TensorFlow】学习资源汇总以及