?線程切換
?線程創建之后,調用start()方法開始運行。當線程執行wait()方法之后,線程進入等待狀態。進入等待狀態的線程需要依靠其他線程的通知才能夠返回到運行狀態,而超時等待狀態相當于在等待狀態的基礎上增加了超時限制,也就是超時時間到達時將會返回到運行狀態。當線程調用同步方法時,在沒有獲取到鎖的情況下,線程將會進入到阻塞狀態。線程在執行Runnable的run()方法之后將會進入到終止狀態。
等待狀態和阻塞狀態的區別、
等待狀態和阻塞狀態都表示線程暫時停止執行,但是它們的原因和發生場景不同。
等待狀態是指一個線程調用了Object類的wait()方法,使得線程進入等待狀態,直到被notfy()或notfyAll()方法喚醒。等待狀態通常是為了實現線程間的協作,等待某個條件的出現后再繼續執行。
阻塞狀態是指一個線程因為某些原因(如等待ⅣO操作完成或試圖獲得一個鎖)而暫停執行,直到滿足特定條件后再繼續執行。阻塞狀態通常是由于外部原因導致的,例如等待用戶輸入、等待網絡傳輸等。
總的來說,等待狀態是由于線程自身的行為導致的,而阻塞狀態是由于外部條件的限制導致的。
處于等待狀態的線程和處于阻塞狀態的線程有區別嗎
注意這里說的是資源
等待狀態的線程通常是在等待某個條件滿足后才能繼續執行,例如等待一個資源被釋放后才能使用。
而阻塞狀態的線程則是被一個外部條件所阻塞,例如等待用戶輸入或等待網絡連接等情況。
在等待狀態下,線程會主動釋放所占用的資源,而在阻塞狀態下,線程會一直占用資源直到外部條件滿足才會被喚醒
??????????????????????????????????
線程阻塞狀態和掛起狀態的區別
線程阻塞狀態和掛起狀態的區別在于,線程阻塞狀態是指線程因為等待某個條件而被暫停執行,而掛起狀態是指線程被主動暫停執行,等待被恢復執行。在阻塞狀態下,線程會一直等待條件滿足后才能繼續執行,而在掛起狀態下,線程需要等待外部的恢復操作才能繼續執行。
?
注意
Java將操作系統中的運行和就緒兩個狀態合并稱為運行狀態。阻塞狀態是線程
阻塞在進入synchronized關鍵字修飾的方法或代碼塊(獲取鎖)時的狀態,但是阻塞在
java.concurrent包中Lock接口的線程狀態卻是等待狀態,因為java.concurrent包中Lock接口對于
阻塞的實現均使用了LockSupport類中的相關方法。
中斷v
中斷可以理解為線程的一個標識位屬性,它表示一個運行中的線程是否被其他線程進行
了中斷操作。中斷好比其他線程對該線程打了個招呼,其他線程通過調用該線程的interrupt()
方法對其進行中斷操作。
線程通過檢查自身是否被中斷來進行響應,線程通過方法isInterrupted()來進行判斷是否
被中斷,也可以調用靜態方法Thread.interrupted()對當前線程的中斷標識位進行復位。如果該
線程已經處于終結狀態,即使該線程被中斷過,在調用該線程對象的isInterrupted()時依舊會返
回false。
從Java的API中可以看到,許多聲明拋出InterruptedException的方法(例如Thread.sleep(long
millis)方法)這些方法在拋出InterruptedException之前,Java虛擬機會先將該線程的中斷標識位清除,然后拋出InterruptedException,此時調用isInterrupted()方法將會返回false。
安全的去停止線程
中斷狀態是線程的一個標識位,而中斷操作是一種簡便的線程間交互方式,而這種交互方式最適合用來取消或停止任務。除了中斷以外,還可以利用一個boolean變量來控制是否需要停止任務并終止該線程.
示例在執行過程中,main線程通過中斷操作和cancel()方法均可使CountThread得以終止。
這種通過標識位或者中斷操作的方式能夠使線程在終止時有機會去清理資源,而不是武斷地
將線程停止,因此這種終止線程的做法顯得更加安全和優雅。
stop為什么不安全
stop方法:強制停止一個正在運行的線程,無論此時線程是何種狀態。
stop方法在停止線程時需要自行指定線程退出邏輯,否則線程會立即退出,不做任何清理操作,非常不安全,會造成數據不一致問題。