1. 線程相關概念瀏覽器
進程:一個操做系統中能夠同時運行多個任務(程序),每一個運行的任務(程序)被稱爲一個進程。安全
線程:一個程序同時可能運行多個任務(順序執行流),那麼每一個任務(順序執行流)就叫作一個線程。即在進程內部。多線程
併發:線程是併發運行的。操做系統將時間化分爲若干個片斷(時間片),儘量的均勻分配給每個任務,被分配時間片後,任務就有機會被cpu所執行。微觀上看,每一個任務都是走走停停的。但隨着cpu高效的運行,宏觀上看全部任務都在運行。這種都運行的現象稱之爲併發,但不是絕對意義上的「同時發生」。併發
線程調度:線程調度機制會將全部併發任務作統一的調度工做,劃分時間片(能夠被cup執行的時間)給每個任務,時間片儘量的均勻,但作不到絕對均勻。一樣,被分配時間片後,該任務被cpu執行,但調度的過程當中不能保證全部任務都是平均的獲取時間片的次數。只能作到儘量平均。這兩個都是程序不可控的。異步
線程的啓動和中止:void start():想併發操做不要直接調用run方法!而是調用線程的start()方法啓動線程!void stop():不要使用stop()方法來中止線程的運行,這是不安全的操做,想讓線程中止,應該經過run方法的執行完畢來進行天然的結束。ide
2. 線程的建立方式spa
1)繼承自Thread,而後重寫run方法:run方法中應該定義咱們須要併發執行的任務邏輯代碼。 操作系統
案例29:線程
2)實現Runnalbe接口。由於有了這樣的設計,纔有了線程池。設計
Runnable接口:用於定義線程要執行的任務邏輯。咱們定一個類實現Runnable接口,這時咱們必須重寫run方法,在其中定義咱們要執行的邏輯。以後將Runnable交給線程去執行。從而實現了線程與其執行的任務分離開。將任務分別交給不一樣的線程併發處理,可使用線程的重載構造方法:Thread(Runnable runnable)。解藕:線程與線程體解藕,即打斷依賴關係。
案例30:
3)線程的建立方式三:使用匿名內部類方式建立線程
案例31:
3. 線程的生命週期
線程的生命週期有5種狀態:建立(new)、就緒(runnable)、運行(running)、阻塞(block)、死亡(dead)。
4. 線程的經常使用方法
① static void sleep(times)方法:讓當前線程主動進入Block阻塞狀態,並在time毫秒後回到Runnalbe狀態。 注意事項:使用Thread.sleep()方法阻塞線程時,強制讓咱們必須捕獲「中斷異常」。
案例32:
② void interrupt()方法:打斷/喚醒線程。一個線程能夠提早喚醒另一個sleep Block的線程。
注意事項:方法中定義的類叫局部內部類:局部內部類中,若想引用當前方法的其餘局部變量,那麼該變量必須是final的。
案例33:
③ static void yield():當前線程讓出處理器(離開Running狀態)即放棄當前時間片,主動進入Runnable狀態等待。
④ final void setPriority(int):設置線程優先級;優先級越高的線程,理論上獲取cpu的次數就越多。但理想與現實是有差距的……設置線程優先級必定要在線程啓動前設置!
案例34:
5. wait和notify方法
這兩個方法不是在線程Thread中定義的方法,這兩個方法定義在Object中。兩個方法的做用是用於協調線程工做的。
(1) 等待機制與鎖機制密切關聯:wait/notify方法必須與synchronized同時使用,誰調用wait或otify方法,就鎖誰!
(2) wait()方法:當條將不知足時,則等待。當條件知足時,等待該條件的線程將被喚醒。如:瀏覽器顯示一個圖片,displayThread要想顯示圖片,則必須等代下載線程downloadThread將該圖片下載完畢。若是圖片沒有下雜完成,則dialpayThread能夠暫停。當downloadThread下載完成後,再通知displayThread能夠顯示了,此時displayThread繼續執行。
(3) notify()方法:隨機通知、喚醒一個在當前對象身上等待的線程。
(4) notifyAll方法:通知、喚醒全部在當前對象身上等待的線程。
6. 守護線程
Daemon後臺線程也稱爲守護線程:當前進程中"全部"、"前臺"線程死亡後,後臺線程將被強制死亡(非天然死亡),不管是否還在運行。
①守護線程,必須在啓動線程前調用。
②main方法也是靠線程運行的,且是一個前臺線程。
案例35:
7. 線程的併發安全
多線程在訪問同一個數據時(寫操做),可能會引起不安全操做。
① 同步異步:
同步:同一時刻只能有一個執行,A和B配合工做,步調一致的處理(B獲得A的執行結果才能繼續)。如一羣人刷卡上公交車。
異步:同一時刻能有多個執行,併發,各自幹各自的。如一羣人騎自行車。
② synchronized能夠修飾方法也能夠單獨做爲語句塊存在(同步塊)。做用是限制多線程併發時同時訪問該做用域。
③ synchronized修飾方法後,會爲方法上鎖。方法就不是異步的了,而是同步的。鎖的是當前對象。
④ synchronized同步塊:分析出只有一段代碼須要上鎖,則使用。效率比直接修飾方法要高。
⑤ 線程安全的效率低,如Vector、Hashtable。線程不安全的效率高,如ArrayList、HashMap 。
案例36: