|
基本概念 進程 所謂進程就是運行在操作系統(tǒng)的一個任務(wù),進程是計算機任務(wù)調(diào)度的一個單位,操作系統(tǒng)在啟動一個程序的時候,會為其創(chuàng)建一個進程,JVM就是一個進程。進程與進程之間是相互隔離的,每個進程都有獨立的內(nèi)存空間。 計算機實現(xiàn)并發(fā)的原理是:CPU分時間片,交替執(zhí)行,宏觀并行,微觀串行。同理,在進程的基礎(chǔ)上分出更小的任務(wù)調(diào)度單元就是線程,我們所謂的多線程就是一個進程并發(fā)多個線程。 線程 在上面我們提到,一個進程可以并發(fā)出多個線程,而線程就是最小的任務(wù)執(zhí)行單元,具體來說,一個程序順序執(zhí)行的流程就是一個線程,我們常見的main就是一個線程(主線程)。 線程的組成 想要擁有一個線程,有這樣的一些不可或缺的部分,主要有:CPU時間片,數(shù)據(jù)存儲空間,代碼。 CPU時間片都是有操作系統(tǒng)進行分配的,數(shù)據(jù)存儲空間就是我們常說的堆空間和??臻g,在線程之間,堆空間是多線程共享的,??臻g是互相獨立的,這樣做的好處不僅在于方便,也減少了很多資源的浪費。代碼就不做過多解釋了,沒有代碼搞個毛的多線程。 線程的創(chuàng)建和啟動 傳統(tǒng)創(chuàng)建線程有兩種方式
JDK1.5 線程池 ExecutorService(線程池 interface) Callable對象 從以上這段代碼我們可以看到很多不一樣的地方,首先在Callable對象中是可以拋出異常的,其次有返回值,在這個基礎(chǔ)上也就引出了一個新的問題,如果接收該線程的對象?JDK1.5中也給出了解決的方法是Future對象. 啟動線程 在這里我們需要明白,上面兩種方式并不會讓我們得到真正的線程,只是得到了線程對象,只有啟動線程,才算得到了真正的線程。 通過執(zhí)行start()方法能夠啟動一個線程,但是啟動線程并不是立即執(zhí)行,成功啟動的線程會處于就緒狀態(tài),什么時候執(zhí)行需要等到拿到時間片之后。 線程的分類 用戶線程和守護(Daemon)線程。 守護線程:守護線程會一直運行,直到其他非守護線程都結(jié)束的時候,才會結(jié)束。有一個典型的守護線程就是:垃圾回收線程,和虛擬機共存亡,直到虛擬機中沒有任何線程的時候虛擬機關(guān)閉的時候才會終止,簡單說就是虛擬機在,它就在,虛擬機亡便亡。 線程的狀態(tài) 上面我們提到過,一個線程在啟動之后不會立馬執(zhí)行,而是處于就緒狀態(tài)(Ready),就緒狀態(tài)就是線程的狀態(tài)的一種,處于這種狀態(tài)的線程意味著一切準備就緒, 需要等待系統(tǒng)分配到時間片。為什么沒有立馬運行呢,因為同一時間只有一個線程能夠拿到時間片運行,新線程啟動的時候讓它啟動的線程(主線程)正在運行,只有等主線程結(jié)束,它才有機會拿到時間片運行。 **線程的狀態(tài):**初始狀態(tài)(New),就緒狀態(tài)(Ready),運行狀態(tài)(Running)(特別說明:在語法的定義中,就緒狀態(tài)和運行狀態(tài)是一個狀態(tài)Runable),等待狀態(tài)(Waitering),終止狀態(tài)(Terminated) RUNNABLE),等待狀態(tài)(Waitering),終止狀態(tài)(Terminated) 初始狀態(tài)(New) 線程對象被創(chuàng)建出來,便是初始狀態(tài),這時候線程對象只是一個普通的對象,并不是一個線程。 Runable **就緒狀態(tài)(Ready):**執(zhí)行start方法之后,進入就緒狀態(tài),等待被分配到時間片。 **運行狀態(tài)(Running):**拿到CPU的線程開始執(zhí)行。處于運行時間的線程并不是永久的持有CPU直到運行結(jié)束,很可能沒有執(zhí)行完畢時間片到期,就被收回CPU的使用權(quán)了,之后將會處于等待狀態(tài)。 等待狀態(tài)(Waiting) 等待狀態(tài)分為有限期等待和無限期等待,所謂有限期等待是線程使用sleep方法主動進入休眠,有一定的時間限制,時間到期就重新進入就緒狀態(tài),再次等待被CPU選中。 而無限期等待就有些不同了,無限期并不是指永遠的等待下去,而是指沒有時間限制,可能等待一秒也可能很多秒。至于進入等待的原因也不盡相同,可能是因為CPU時間片到期,也可能是因為一個比較耗時的操作(數(shù)據(jù)庫),或者主動的調(diào)用join方法。 wait和sleep的區(qū)別
阻塞狀態(tài)(Blocked) 在我看來,阻塞狀態(tài)實際上是相當(dāng)特殊的待機狀態(tài)。 其他等待線程正在等待其他線程等待使用CPU的權(quán)利。 線程仍然卡住。 即使處理器沒有處于自由的狀態(tài),它不僅適用于使用主鎖標記CPU的權(quán)利,而且也適用鎖標記。 (鎖定在下一節(jié):線程同步) 等待和阻塞的區(qū)別
終止線程(Terminated) 已經(jīng)終止的線程會處于該種狀態(tài)。 |
|
|
來自: Frank_Chia > 《JAVA》