Java多線程

一、線程的基本概念
每一個操作系統都會運行程序,一個正在運行的程序是一個進程,每一個進程都是系統進行資源分配和調度的獨立單位,而每一個進程又包含多個線程。通常java中的main方法裏的代碼就是一個主線程,它會順序執行main方法中的代碼,所以每個線程也可以看作一個順序執行流。
併發與並行兩種概念會經常出現在多線程中。對於一個CPU而言,它在某一個時刻只能執行一個程序,也就是說,只能運行一個進程。但CPU會不斷的在這些進程之間進行輪換執行,轉換時間間隔極短,這樣就好造成一種所有進程指令一起運行的假象,也就是並發現象。而並行則是指同一時刻,有多條指令在多個處理器上同時執行,這樣會提高程序的運行速度。
二、創建線程的方式
創建線程有兩種方式
1、直接繼承Thread類,重寫run方法,創建實例直接new一個對象,運行線程體就調用start方法,簡單易用;
2、實現Runable接口,重寫run方法,new一個對象作爲Thread的target來創建對象,稍微複雜,但可以繼承其他類;
三、線程生命週期
新建 線程新建對象還沒有調用start方法時
就緒 線程對象調用start方法後,系統分配資源前
執行 系統分配了資源,開始執行線程的run方法的代碼
阻塞 系統正在執行其他線程,當前線程還沒執行完,並且不處於就緒狀態
死亡 整線程完成就會正常死亡,也可以調用stop方法(容易造成死鎖,不建議使用),也有一些情況線程也會死亡,如後臺線程會在前臺線程死亡時自動死亡
四、線程的控制
多線程的結果很有意思,存在一定的偶然性,因爲線程的執行是由系統的線程調度機制決定的,人爲無法控制。但人們需求又不可避免要用到多線程,所以線程的控制很重要。
1、使用線程的join方法,在一個線程中調用一個子線程的join方法時,一旦執行了子線程就必須等子線程執行完才能返回到父線程,然後再繼續執行父線程;
2、後臺進程,也就是守護進程,當一個線程調用setDaemon(true)方法時就會變爲後臺進程。前面有提到,一旦前臺進程全部死亡,後臺進程會自動死亡;
3、進程的睡眠,通過調用sleep的方法進行睡眠,這樣線程會暫停一段時間,並進入阻塞狀態;
設計一個程序,讀取一個txt文件的內容,在控制檯每隔300毫秒打印一行字符
這裏寫圖片描述
4、線程的讓步,通過調用yield方法實現,其和sleep方法類似,但不會阻塞線程,而是進入就緒狀態,只有比當前線程優先級高或者相同的纔會得到執行;
線程優先級通過setPriority方法設置,參數可以選擇1到10之間的數字,數字越大,優先級越高。但優先級高不代表一定會先執行,只是該線程更容易獲得系統資源
5、線程的同步,因爲多線程存在偶然性,所以通常是不安全的。尤其在共享同一個資源的情況下。這個時候就要用到線程同步。
有兩種方式進行同步:
a、同步代碼塊的方式
synchronized(obj){ },任何線程進入同步代碼塊都要獲得同步監視器obj的鎖定,其他線程就無法獲得鎖,那麼就無法修改代碼塊中內容。這樣同一時期,只有一個線程對共享代碼塊進行修改,保證了線程安全性;
b、同步方法
用synchronized修飾一個方法,與同步代碼塊類似,其同步監視器是當前對象。
作業:用多線程的方法循環輸出ABC
這裏寫圖片描述
這裏寫圖片描述
結果不一定會得到想要的結果,但機率比較大:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章