線程
我們知道線程是比進程更加輕量級的調(diào)度執(zhí)行單位,線程的引入可以把一個進程的資源分配和執(zhí)行調(diào)度分開,各個線程之間共享進程資源,又可以獨立調(diào)度.
java線程的實現(xiàn)
主流的操作系統(tǒng)都提供了線程的實現(xiàn),java則提供了在不同硬件和操作系統(tǒng)下對線程的一致性操作,在java中每個執(zhí)行了start()方法并且還沒有結束的java.lang.Thread類的實例都代表了一個線程.
java線程在jdk1.2之前,是基于成為綠色線程的用戶線程實現(xiàn)的,而在jdk1.2中,java的線程模型替換為基于操作系統(tǒng)原生線程模型來實現(xiàn).
對于sun jdk來說,它的linux版本與windows版本都是使用一對一的線程模型實現(xiàn)的,一條java線程映射一個輕量級進程.
(對于線程的實現(xiàn)可參考線程的實現(xiàn))
java線程的調(diào)度
線程的調(diào)度是指系統(tǒng)為線程分配處理器使用權的過程,主要的調(diào)度方式有兩種,一種是協(xié)同式,一種是搶占式.
協(xié)同式線程調(diào)度(Cooperative Threads Scheduling):
如果使用協(xié)同式調(diào)度的多線程系統(tǒng),線程的執(zhí)行時間由線程本身來控制,線程把自己的工作執(zhí)行完了之后,要主動通知系統(tǒng)切換到另外個線程上。 協(xié)同式多線程的最大好處是實現(xiàn)簡單岩喷,而且由于線程要把自己的事情干完后才會進行線程切換,切換操作對線程自己是可知的监憎,所以沒有什么線程同步的問題纱意。但是使用協(xié)同式來實現(xiàn)多進程多任務,相當不穩(wěn)定枫虏,一個進程堅持不讓出CPU執(zhí)行時間就可能會導致整個系統(tǒng)崩潰妇穴。
搶占式線程調(diào)度(Preemptive ThresScheduling):
如果使用搶占式調(diào)度的多線程系統(tǒng)爬虱,那么每個線程將由系統(tǒng)來分配執(zhí)行時間,線程的切換不由線程本身來決定(在Java中腾它,Thread.yield()可以讓出執(zhí)行時間跑筝,但是要獲取執(zhí)行時間的話,線程本身是沒有什么辦法的)瞒滴。在這種實現(xiàn)線程調(diào)度的方式下曲梗,線程的執(zhí)行時間是系統(tǒng)可控的,也不會有一個線程導致整個進程阻塞的問題妓忍,Java 使用的線程調(diào)度方式就是搶占式調(diào)度虏两。
java線程狀態(tài)轉換
Java定義了5種線程狀態(tài),在任意一個時間點世剖,一個線程只能有且只有其中的一種狀態(tài)定罢,這5種狀態(tài)分別如下。
新建(New):創(chuàng)建后尚未啟動的線程處于這種狀態(tài)旁瘫。
運行(Runable): Runable 包括了操作系統(tǒng)線程狀態(tài)中的Running和Ready,也就是處于此狀態(tài)的線程有可能正在執(zhí)行祖凫,也有可能正在等待著CPU為它分配執(zhí)行時間。
無限期等待(Waiting): 處于這種狀態(tài)的線程不會被分配CPU執(zhí)行時間酬凳,它們要等待被其他線程顯式地喚醒.
以下方法會讓線程陷人無限期的等待狀態(tài):
1.沒有設置Timcout參數(shù)的Object.wait()方法
2.沒有設置Timcout參數(shù)的Thread.join()方法惠况。
3.LockSupport.park()方法。
限期等待(Timed Waiting):處于這種狀態(tài)的線程也不會被分配CPU執(zhí)行時間宁仔,不過無須等待被其他線程顯式地喚醒稠屠,在一定時間之后它們會由系統(tǒng)自動喚醒。
以下方法會讓線程進人限期等待狀態(tài):
1.Thread.sleep() 方法.
2.設置了Timeout參數(shù)的Object.wait()方法.
3.設置了Timeout參數(shù)的Threadjoin(方法.
4.LockSupport.parkNanos() 方法.
5.LockSupport.parkUntil()方法.
阻塞(Blocked):線程被阻塞了翎苫,“阻塞狀態(tài)”與“等待狀態(tài)”的區(qū)別是:“阻塞狀態(tài)”在等待著獲取到一個排他鎖权埠,這個事件將在另外一個線程放棄這個鎖的時候發(fā)生,而等待狀態(tài)則是在等待一段段時間,或者喚醒動作的發(fā)生拉队。在程序等待進人同步區(qū)域的時候弊知,線程將進人這種狀態(tài)。
結束(Terminated): 已終止線程的線程狀態(tài)粱快,線程已經(jīng)結束執(zhí)行秩彤。上述5種狀態(tài)在遇到特定事件發(fā)生的時候?qū)ハ噢D換,它們的轉換關系如圖所示事哭。