問(wèn)題
什么是線程的中斷標(biāo)志,如何設(shè)置和檢查它,它是如何和中斷異常相關(guān)的
答案
線程的中斷標(biāo)志
線程的中斷標(biāo)志,是每個(gè)線程內(nèi)部的一個(gè)標(biāo)志,是每個(gè)線程對(duì)象內(nèi)部的一個(gè)成員變量,這個(gè)標(biāo)志要么是true,要么是false,.線程的中斷并不是自發(fā)產(chǎn)生的,而是其它線程向本線程發(fā)出的一個(gè)指令,這個(gè)標(biāo)志用來(lái)表示線程是否被中斷,標(biāo)志為true代表線程收到了中斷指令,false則代表線程沒(méi)有收到中斷指令
如何設(shè)置和檢查(獲取)
一個(gè)線程通過(guò)引用另外一個(gè)線程,調(diào)用thread.interrupt()
方法來(lái)中斷另外一個(gè)線程.一旦調(diào)用了thread.interrupt()
方法,另外一個(gè)線程的中斷標(biāo)志位就會(huì)被設(shè)置為true.線程通過(guò)使用Thread.interrupted()
方法來(lái)檢查是否線程被中斷,或者調(diào)用thread.isinterrupted()
方法來(lái)檢查是否線程被中斷.需要注意的是調(diào)用Thread.interrupted()
方法會(huì)獲取線程的中斷標(biāo)志位后清除線程的中斷標(biāo)志位,將其置為false,調(diào)用thread.isinterrupted()
只會(huì)獲取線程的標(biāo)志位,而不會(huì)清除中斷標(biāo)志位.
如何和中斷異常相關(guān)
當(dāng)線程調(diào)用了一個(gè)可能拋出
InterruptedExcepiton
的方法的時(shí)候(比如join()
,wait()
,sleep()
),在這些方法內(nèi)部中,會(huì)不斷的檢查是否收到中斷指令(中斷標(biāo)志位為true),一旦為true,則拋出一個(gè)InterruptedExcepiton
異常.線程負(fù)責(zé)在catch()
方法處理異常捕獲的邏輯.當(dāng)線程沒(méi)有執(zhí)行上面的幾個(gè)可能拋出
InterruptedException
的方法的時(shí)候,要想檢查是否被中斷,只能線程主動(dòng)的調(diào)用Thread.interrupted()
或者thread.isinterrupted
去獲取線程中斷標(biāo)志位的狀態(tài),如果為true則表示收到中斷指令(上述幾個(gè)方法內(nèi)部實(shí)現(xiàn)了這種邏輯),至于是否要拋出InterruptedException
則由本線程自己決定,但通常是要拋出一個(gè)InterruptedException
.