工做忙起來,居然把博客都忘了,罪過罪過。java
幾天我一直有在看多線程基礎方面的東西。由於多線程是編程中避免不了的東西。所以學習多線程頗有必要。這裏就先簡單介紹一下多線程的基礎概念。後續有深刻的學習研究。編程
多線程是Java中不可避免的一個重要主體。關注個人博友們,將與我一道展開對多線程的學習。而後,接下來的內容,是對JUC(java.util.concurrent)的研究。「基礎篇」中只涉及Object的wait()、notify()等接口、Thread類中的接口和多線程鎖機制。多線程
線程是一個程序的多個執行路徑,執行調度的單位,依託於進程存在。線程不只能夠共享進程的內存,並且還擁有本身的棧空間,棧空間是創建線程時由系統分配的,主要用來保存線程內部所使用的數據。併發
在Java程序中使用多線程有許多緣由,使用線程的一些緣由是他們能夠幫助:異步
a.使響應更快學習
b.利用多個處理器系統spa
c.執行異步或後臺處理:在不阻塞整個程序的狀況下,執行阻塞io。操作系統
d.利用多個線程分解大任務。線程
使用線程是有代價的,若是程序時計算密集型且每一步都有依賴,那麼使用線程反而致使效率降低,由於多個線程之間須要切換,還要負責維護鎖,信號量等設施,對並行計算的計算密集型問題和i/o與計算可重疊的問世使用多線程,通常會達到顯著的效果。程序中有多個可併發的模塊的時候,使用線程也能提升程序的響應速度。對象
(網上一搜一堆,可是這裏有必要給出一下)
線程共包括如下6種狀態。
1.New(新建立):當用new操做符建立一個新線程時,好比new Thread(r),該線程尚未開始運行。這意味着它的狀態是new。
2.Runnable(可運行):一旦調用線程的start()方法,線程處於runnable狀態,一個可運行的線程可能處於正在運行也可能沒有運行,這取決於操做系統給線程提供運行的時間。
3.Blocked(被阻塞):當線程處於被阻塞狀態時,它暫時不活動,它不運行任何代碼且消耗最小的資源。知道線程調度器從新激活它。當一個線程試圖獲取一個內部的對象鎖,而該鎖被其餘線程所持有,則該線程進入阻塞狀態。當全部其餘線程釋放該鎖,而且線程調度器容許本線程持有它時,該線程將變成非阻塞狀態。
4.Waiting(等待):當線程等待另外一個線程通知調度器一個條件時,它本身進入等待狀態。在調用Object.wait方法或Thread.join方法,就會出現這種狀況。
5.Timed waiting(計時等待):有幾個方法有一個超時參數。調用它們致使線程進入計時等待狀態。這一狀態將一直保持到超時期滿或者接收到適當的通知。帶有超時參數的方法有Thread.sleep和Object.wait、Thread.join、Lock.tryLock以及Condition.await。
6.Terminated(被終止):線程因兩個緣由而終止:a.由於run方法正常退出而天然終止。b.由於一個沒有捕獲的異常終止了run方法而意外死亡。特別地,能夠調用線程的stop方法殺死一個線程。該方法拋出ThreadDeath錯誤對象,由此殺死線程。
這6種狀態涉及到的內容包括Object類,Thread和synchronized關鍵字,這些內容咱們將在後續章節逐個學習。
今天先了解一下Java線程和多線程的基本概念,下面將介紹具體的多線程實現以及用法,這對後續章節的學習頗有幫助。