線程 1.線程的實現 (1)實現線程主要有3中方式:使用內核線程實現,使用用戶線程實現和使用用戶線程加輕量級進程混合實現。 (2)使用內核線程實現 內核線程就是直接由操作系統內核支持的線程,這種線程由內核來完成線程切換,內核通過操縱調度器對線程進行調度,並負責將線程映射到處理器上。 局限性:由於是基 ...
線程
1.線程的實現
(1)實現線程主要有3中方式:使用內核線程實現,使用用戶線程實現和使用用戶線程加輕量級進程混合實現。
(2)使用內核線程實現
內核線程就是直接由操作系統內核支持的線程,這種線程由內核來完成線程切換,內核通過操縱調度器對線程進行調度,並負責將線程映射到處理器上。
局限性:由於是基於內核線程實現的,所有線程操作,如創建,析構及同步,都需要進行系統調用。每一個輕量級進程都需要又一個內核線程的支持,因此輕量級進程要消耗一定的資源,因此一個系統支持輕量級進程的數量是有限的。
(3)使用用戶線程實現
狹義上的用戶線程指的是完全建立在用戶空間的線程庫上的,系統的內核不能感知線程的存在的實現。用用戶線程的建立、同步、銷毀和調度完全在用戶態中完成,不需要內核的幫助。
(4)使用用戶線程和輕量級進程混合實現
混合模式下,既存在用戶進程,也存在輕量級進程。用戶線程還是完全建立在用戶空間中,因此,用戶線程的創建、切換、析構等操作依然廉價,並且可以支持大規模的用戶線程併發。而操作系統提供支持的輕量級進程,則可以作為用戶線程之間的橋梁,這樣可以使用內核提供的線程調度功能及處理器映射,並且用戶線程的系統調用要通過輕量級線程結束完成,大大降低了整個進程被完全阻塞的風險。
(5)Java線程在JDK1.2之前,是基於稱為“綠色線程”的用戶線程實現的,而在JDK1.2中,線程模型替換為基於操作系統原生線程嗎,模型來實現。
2.Java線程調度
(1)線程調度是指系統為線程分配處理器使用權的過程,主要的方式有兩種,分別是協同式線程調度和搶占式線程調度。
(2)使用協同式調度的多線程系統,線程的執行時間由線程本身來控制,線程把自己的工作執行完成後,要主動通知系統切換到另外一個線程上。
(3)使用搶占式調度的多線程系統,那麼每個線程將由系統來分配執行時間,線程的切換不由線程本身決定。在這種實現線程調度的方式下,線程的執行時間是系統可控的,也不會有一個線程導致整個進程阻塞的問題,Java使用的線程調度方法就是搶先式調度。
3.轉換
(1)Java語言定義了5種線程狀態,在任意一個時間點,一個線程只能允許有且只有其中的一種狀態。這5種狀態如下:
a) 新建(new):創建尚未啟動的線程處於這種狀態
b) 運行(Runnable):Runnable包括了操作系統線程狀態中的Running和Ready,也就是處於此狀態的線程有可能正在執行,也有可能正在等待著CPU為它分配執行時間。
c) 無限期等待(Waiting):處於這種狀態的線程不會被分配CPU執行時間,它們要等待被其他線程顯式喚醒。
d) 限期等待(Timed Waiting):處於這種狀態的線程不會被分配CPU執行時間,不過無須等待被其他線程顯式地喚醒,在一定時間之後它們會由系統自動喚醒。
e) 阻塞(Blocked):線程狀態被阻塞了,“阻塞狀態”與“等待狀態”的區別是:阻塞狀態在等待著獲取到一個排他鎖,這個事件將一個線程放棄這個鎖的時候發生;而等待狀態則是在等待一段時間,或喚醒動作發生。在程式等待進入同步區域的時候。線程保持這種狀態。
f) 結束(Terminated):已經終止線程的線程狀態。線程已經結結束執行。