在線程切換的時(shí)候不涉及CPU寄存器的保存以及進(jìn)程狀態(tài)的保護(hù)。
線程實(shí)現(xiàn)整個(gè)環(huán)境的異步模式,但有時(shí)需要同步(兩個(gè)線程同時(shí)讀寫同一數(shù)據(jù))。
線程通過(guò)sleep或者yeild主動(dòng)放棄CPU的占用。
Run()方法幾乎肯定含有某種形式的循環(huán)——它們會(huì)一直持續(xù)到線程不再需要為止。因此,為了中斷并退出這個(gè)循環(huán),必須規(guī)定特定的條件。否則,除非外部發(fā)出對(duì)線程的stop或者destroy調(diào)用,它會(huì)永遠(yuǎn)運(yùn)行下去,直到程序結(jié)束。
堵塞(掛起)狀態(tài)Blocked可能是由下列五方面的原因造成:
1, 調(diào)用sleep(),使線程進(jìn)入睡眠狀態(tài);
2, 用ruspend()暫停了線程的執(zhí)行。除非線程收到resume()消息,否則不會(huì)返回可運(yùn)行狀態(tài);
3, 用wait()暫停了線程執(zhí)行,除非線程收到nofify()或者notifyAll();
4, 線程正在等候一些IO(輸入輸出)操作完成。
5, 線程試圖調(diào)用另一個(gè)對(duì)象的“同步”方法,但哪個(gè)對(duì)象處于鎖定狀態(tài),暫時(shí)無(wú)法使用。
Java沒(méi)有監(jiān)視器這個(gè)類,Java提供的解決方法是為每一個(gè)對(duì)象都有其獨(dú)立的監(jiān)視器,當(dāng)一個(gè)線程進(jìn)入一個(gè)具有同步特性的函數(shù)(sychronized)時(shí),其余線程將不操作同一個(gè)對(duì)象的同步函數(shù),換句話說(shuō),同步機(jī)制已經(jīng)融合進(jìn)了Java語(yǔ)言當(dāng)中。
無(wú)論sleep還是suspend都不會(huì)在自己被調(diào)用的時(shí)候解除縮定,必須等到時(shí)間到了或調(diào)用了自己的resume()方法。
Wait()在掛起內(nèi)部調(diào)用的方法時(shí),會(huì)解釋對(duì)象的鎖定,并且能夠自由的退出wait(),因?yàn)橐粋€(gè)notity()可強(qiáng)行使時(shí)間流逝(當(dāng)wait有參數(shù)時(shí))。
Wait()和notify()同屬Object()類,而sleep,suspend以及resume同屬Thread類。因此,專門進(jìn)行線程處理的東西也就成為通用基礎(chǔ)類(Object)的一部分。因此,我們可將一個(gè)wait()置入任何同步方法內(nèi)部,無(wú)論在哪個(gè)類里是否進(jìn)行涉及線程的處理。
線程池:
池化資源:在面向?qū)ο缶幊讨?,?chuàng)建和銷毀對(duì)象是很費(fèi)時(shí)間的,因?yàn)閯?chuàng)建一個(gè)對(duì)象要獲取內(nèi)存資源或者其它更多的資源,在Java中更是如此,虛擬機(jī)將試圖跟蹤沒(méi)一個(gè)對(duì)象,以便能夠在對(duì)象銷毀后進(jìn)行垃圾回收。所以提高服務(wù)程序效率的一個(gè)手段就是盡可能減少創(chuàng)建和銷毀對(duì)象的次數(shù),特別是一些很耗資源的對(duì)象的創(chuàng)建與銷毀。
一般一個(gè)線程池至少包含下列組成部分。
線程管理器(ThreadPoolManager):用于創(chuàng)建線程池,銷毀線程池,添加新任務(wù)。
工作線程(WorkThread):線程池中線程。
任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行。它規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等。
任務(wù)隊(duì)列:用于存放沒(méi)有處理的任務(wù)。提供一種緩沖機(jī)制。
守護(hù)線程:myThread.setDaemon(true);
守護(hù)線程是一個(gè)后臺(tái)運(yùn)行的線程,從屬于生成它的線程,所以當(dāng)生成守護(hù)線程的線程結(jié)束時(shí),此守護(hù)線程會(huì)隨之消失。相對(duì)與守護(hù)線程的是用戶線程,它有自己的生命周期,不依賴創(chuàng)建它的線程,它可以在創(chuàng)建它的線程結(jié)束后繼續(xù)執(zhí)行。
|