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