Java學習筆記之——線程的生命周期、線程同步
一. 線程的生命周期
新建(new Thrad):創建線程後,可以設置各個屬性值,即啟動前 設置
就緒(Runnable):已經啟動,等待CPU調動
運行(Running):正在被CPU調度
阻塞(Blocked):因為一些原因,暫時不能繼續執行
死亡(Dead):線程代碼運行結束,正常死亡,也可能是非正常
1.線程阻塞
sleep(long millis, int nanos)
導致正在執行的線程以指定的毫秒數加上指定的納秒數來暫停(臨時停止執行),這取決於系統定時器和調度器的精度和準確性。
練習:打印時間,每個一秒刷新一次,共打印十次
2.更改線程優先級(了解)
其實更改優先級作用並不是那麽明顯,了解即可
setPriority(int newPriority)
更改此線程的優先級。1-10(MIN_PRIORITY:1,MAX_PRIORITY:10)
NORM_PRIORITY:5 默認優先級
getPriority()
返回此線程的優先級。
3.停止本次調度,CPU重新分配調度(了解)
yield()
對調度程序的一個暗示,即當前線程願意產生當前使用的處理器。
4.等待線程終止(了解)
yield()
對調度程序的一個暗示,即當前線程願意產生當前使用的處理器。
5.強制停止線程(不建議使用)
stop()
已棄用
這種方法本質上是不安全的。 使用Thread.stop停止線程可以解鎖所有已鎖定的監視器(由於未ThreadDeath ThreadDeath異常在堆棧中ThreadDeath的自然結果)。 如果先前受這些監視器保護的任何對象處於不一致的狀態,則損壞的對象將變得對其他線程可見,可能導致任意行為。 stop許多用途應該被替換為只是修改一些變量以指示目標線程應該停止運行的代碼。 目標線程應該定期檢查此變量,如果變量表示要停止運行,則以有序方式從其運行方法返回。 如果目標線程長時間等待(例如,在interrupt變量上),則應該使用interrupt方法來中斷等待。 有關詳細信息,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。
6.中斷線程(了解)
interrupt()
中斷這個線程。
總結:
停止線程:stop() 不推薦
Interrupt() 不推薦
通過循環條件進行控制,相對溫柔
二. 線程同步
1.線程同步:
多個線程同時修改競爭資源(同一個資源),通過不控制,可能引起以外的結果
2.為什麽需要線程同步?
---線程同步是為了防止多個線程訪問同一個數據對象時,對數據造成破壞
---線程同步是保證多線程訪問競爭資源的一種手段
3.同步和鎖定
Java中每一個對象都有一個內置鎖
可以在整個方法或者代碼塊上添加向某個對象鎖的語法
只有獲取了這個對象鎖,才能執行代碼,否則一只阻塞,等到接到鎖位置
方法一 :在方法上加借鎖:synchronized
public synchronized void test(){
}
方法二:在代碼塊上加借鎖:向指定對象借鎖
Java代碼同步:
1) 屬性私有化
2) 所有修改這個屬性的方法都加synchronized同步
死鎖:
比如:線程一獲取對象一的鎖,線程一獲取對象二的鎖
線程二獲取對象二的鎖,線程二獲取對象一的鎖
4.線程通信
Object類:
wait():對象.wait(),是執行這段代碼的當前線程阻塞,同時會釋放剛剛這個對象借的鎖,一直等到其他地方調用這個對象的notify()或者notifyAll()喚醒線程並再次拿到鎖,繼續執行下去
notify():對象.notify(),喚醒一個其它地方通過對象.wait()阻塞的線程,此時線程還不能向下執行,還需要這個對象上的鎖
notifyAll():對象.notifyAll(),喚醒所有其它地方通過對象.wait()阻塞的線程,此時線程還不能向下執行,還需要這個對象上的鎖
Java學習筆記之——線程的生命周期、線程同步