多執行緒設計模式之兩階段終止模式
阿新 • • 發佈:2022-03-28
Thread類中interrupt()、interrupted()和isInterrupted()
interrupt()是用來設定中斷狀態的。返回true說明中斷狀態被設定了而不是被清除了。我們呼叫sleep、wait等此類可中斷(throw InterruptedException)方法時,一旦方法丟擲InterruptedException,當前呼叫該方法的執行緒的中斷狀態就會被jvm自動清除了,就是說我們呼叫該執行緒的isInterrupted 方法時是返回false。如果你想保持中斷狀態,可以再次呼叫interrupt方法設定中斷狀態。這樣做的原因是,java的中斷並不是真正的中斷執行緒,而只設置標誌位(中斷位)來通知使用者。如果你捕獲到中斷異常,說明當前執行緒已經被中斷,不需要繼續保持中斷位。
interrupted是靜態方法,返回的是當前執行緒的中斷狀態。例如,如果當前執行緒被中斷(沒有丟擲中斷異常,否則中斷狀態就會被清除),你呼叫interrupted方法,第一次會返回true。然後,當前執行緒的中斷狀態被方法內部清除了。第二次呼叫時就會返回false。如果你剛開始一直呼叫isInterrupted,則會一直返回true,除非中間執行緒的中斷狀態被其他操作清除了。
如何確保在執行和等待都能正常快速優雅的打斷程式?
public class Test7 { public static void main(String[] args) throws InterruptedException { Monitor monitor = new Monitor(); monitor.start(); Thread.sleep(3500); monitor.stop(); } } class Monitor { Thread monitor; /** * 啟動監控器執行緒 */ public void start() { //設定線控器執行緒,用於監控執行緒狀態 monitor = new Thread() { @Override public void run() { //開始不停的監控 while (true) { //判斷當前執行緒是否被打斷了 if(Thread.currentThread().isInterrupted()) { System.out.println("處理後續任務"); //終止執行緒執行 break; } System.out.println("監控器執行中..."); try { //執行緒休眠 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); //如果是在休眠的時候被打斷,不會將打斷標記設定為true,這時要重新設定打斷標記 Thread.currentThread().interrupt(); } } } }; monitor.start(); } /** * 用於停止監控器執行緒 */ public void stop() { //打斷執行緒 monitor.interrupt(); } }