多線程的意義:提高程式的使用率,cpu的使用率
實作線程的幾種方式
繼承thread類
重寫run方法
通過start調用啟動
- 建一個類,繼承thread類,重寫run方法。
- 在另一個類裡把剛才那個類new出來,調用對象的start方法
- 這是一個線程 多個線程的話要new多個對象出來 同時調用start方法
實作runnable接口
重寫run
把該類作為參數傳到thread裡
通過start調用
- 建一個類,實作runnable接口,重寫run方法
- 在另一個類裡把剛才的類new出來,再new一個thread類出來,将剛才的對象放在thread對象内
- 要開多個線程的話就new多個thread對象
- 通過thread對象的start方法來運作線程
開發中一般用第二種:
避免java單繼承的局限性
适合多個相同程式代碼處理同一個資源的情況
線程的命名
通過setname方法來設定名字
(繼承thread類)在類中寫一個構造方法,傳一個string對象(名字)進去,構造方法内用super調用
thread類的有參構造
(實作runnable接口)在newthread的時候,将對象和線程的名字兩個都傳進去。
run和start的差別
run:僅僅封裝被線程執行的代碼,直接調用的話相當于普通方法
start:首先啟動一個線程,通過jvm調用run方法
優先級 setpriority()
優先級越高,搶到的機率越高,并不是高的一定能搶到
1~10的整數,預設是5
放在start之前
休眠 sleep()
加入線程 join() 會把目前線程執行完 再執行其他線程
**線程禮讓 yeild() **讓目前運作狀态的線程釋放自己的cpu資源,從運作狀态變為就緒狀态,然後重新和其他線程搶資源 禮讓不一定成功 當線程轉為就緒狀态時,搶到cpu,從中斷位置繼續執行
守護線程(背景線程) setdaemon(true)
當所有非守護線程死亡後守護線程也會死亡,由于裝置延遲,守護線程會運作一小段再死亡
中斷線程
stop()太暴力 不建議使用
interrupt() 隻能改變目前線程的狀态為中斷(true),并不能中斷一個正在運作的線程,在這個基礎上進入阻塞狀态(sleep,wait,join),就會抛出interruptedexception,中斷狀态被清除,重新設定為false,線程退出。 無論是先中斷還是先阻塞都能達到停止線程的目的。
this.interrupted()方法 測試目前線程是否中斷(靜态),會傳回上一次的中斷狀态,并且會清除該狀态,連續調用兩次,第一次傳回true,第二次傳回false。
this.isinterrupted()方法 測試目前線程是否中斷,但是不會清除目前狀态。