在java的線程Thread類中有三個(gè)方法,,比較容易混淆,在這里解釋一下 (1)interrupt:置線程的中斷狀態(tài) (2)isInterrupt:線程是否中斷 (3)interrupted:返回線程的上次的中斷狀態(tài),,并清除中斷狀態(tài) 舉個(gè)例子: [java]
view plaincopy
一般來(lái)說(shuō),,阻塞函數(shù),,如:Thread.sleep、Thread.join,、Object.wait,、LockSupport.park等在檢查到線程的中斷狀態(tài)時(shí),會(huì)拋出InterruptedException,,同時(shí)會(huì)清除線程的中斷狀態(tài) 對(duì)于InterruptedException的處理,,可以有兩種情況: (1)外層代碼可以處理這個(gè)異常,直接拋出這個(gè)異常即可 (2)如果不能拋出這個(gè)異常,,比如在run()方法內(nèi),,因?yàn)樵诘玫竭@個(gè)異常的同時(shí),線程的中斷狀態(tài)已經(jīng)被清除了,,需要保留線程的中斷狀態(tài),,則需要調(diào)用Thread.currentThread().interrupt() 另外,Thread.interrupted()在jdk庫(kù)的源代碼中比較常用,因?yàn)樗瓤梢缘玫缴弦淮尉€程的中斷標(biāo)志值,,又可以同時(shí)清除線程的中斷標(biāo)志,,一舉兩得,但同時(shí)也有壞處,,就是這個(gè)函數(shù)有清除中斷狀態(tài)的副作用,,不容易理解 |
|
來(lái)自: 昵稱14689819 > 《java》