摘要:結(jié)論先行將調(diào)用該方法的對象所表示的線程標記一個停止標記,并不是真的停止該線程。獲取當前線程的中斷狀態(tài),并且會清除線程的狀態(tài)標記。因為執(zhí)行后它會將狀態(tài)標志清除,底層調(diào)用了,此處參數(shù)為。
1. 結(jié)論先行
interrupt():將調(diào)用該方法的對象所表示的線程標記一個停止標記,并不是真的停止該線程。interrupted():獲取當前線程的中斷狀態(tài),并且會清除線程的狀態(tài)標記。是一個是靜態(tài)方法。
isInterrupted():獲取調(diào)用該方法的對象所表示的線程,不會清除線程的狀態(tài)標記。是一個實例方法。
現(xiàn)在對各方法逐一進行具體介紹:
2. interrupt()首先我們來使用一下 interrupt() 方法,觀察效果,代碼如下:
public class MainTest { @Test public void test() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(2000); myThread.interrupt(); } catch (Exception e) { System.out.println("main catch"); e.printStackTrace(); } } } public class MyThread01 extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 500; i++) { System.out.println("i= " + i); } } }
輸出結(jié)果:
可以看出,子線程已經(jīng)執(zhí)行完成了。說明 interrupt() 方法是不能讓線程停止,和我們一開始所說的那樣,它僅僅是在當前線程記下一個停止標記而已。
那么這個停止標記我們又怎么知道呢?——此時就要介紹下面的 interrupted() 和 isInterrupted() 方法了。
3. interrupted() 和 isInterrupted()interrupted() 方法的聲明為 public static boolean interrupted()
isInterrupted() 方法的聲明為 public boolean isInterrupted()
這兩個方法很相似,下面我們用程序來看下使用效果上的區(qū)別吧
先來看下使用 interrupted() 的程序。
@Test public void test() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(1000); // 7行: Thread.currentThread().interrupt(); // Thread.currentThread() 這里表示 main 線程 myThread.interrupt(); // myThread.interrupted() 底層調(diào)用了 currentThread().isInterrupted(true); 作用是判斷當前線程是否為停止狀態(tài) System.out.println("是否中斷1 " + myThread.interrupted()); System.out.println("是否中斷2 " + myThread.interrupted()); } catch (InterruptedException e) { System.out.println("main catch"); } System.out.println("main end"); }
輸出結(jié)果:
由此可以看出,線程并未停止,同時也證明了 interrupted() 方法的解釋:測試當前線程是否已經(jīng)中斷,這個當前線程就是 main 線程,它從未中斷過,所以打印結(jié)果都是 false。
那么如何使 main 線程產(chǎn)生中斷效果呢?將上面第 8 行代碼注釋掉,并將第 7 行代碼的注釋去掉再運行,我們就可以得到以下輸出結(jié)果:
從結(jié)果上看,方法 interrupted() 的確判斷出了當前線程(此例為 main 線程)是否是停止狀態(tài)了,但為什么第二個布爾值為 false 呢?我們在最開始的時候有說過——interrupted() 測試當前線程是否已經(jīng)是中斷狀態(tài),執(zhí)行后會將狀態(tài)標志清除。
因為執(zhí)行 interrupted() 后它會將狀態(tài)標志清除,底層調(diào)用了 isInterrupted(true),此處參數(shù)為 true 。所以 interrupted() 具有清除狀態(tài)標記功能。
在第一次調(diào)用時,由于此前執(zhí)行了 Thread.currentThread().interrupt();,導致當前線程被標記了一個中斷標記,因此第一次調(diào)用 interrupted() 時返回 true。因為 interrupted() 具有清除狀態(tài)標記功能,所以在第二次調(diào)用 interrupted() 方法時會返回 false。
以上就是 interrupted() 的介紹內(nèi)容,最后我們再來看下 isInterrupted() 方法吧。
isInterrupted() 和 interrupted() 有兩點不同:一是不具有清除狀態(tài)標記功能,因為底層傳入 isInterrupted() 方法的參數(shù)為 false。二是它判斷的線程調(diào)用該方法的對象所表示的線程,本例為 MyThread01 對象。
我們修改一下上面的代碼,看下運行效果:
@Test public void test() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(1000); myThread.interrupt(); // 修改了下面這兩行。 // 上面的代碼是 myThread.interrupted(); System.out.println("是否中斷1 " + myThread.isInterrupted()); System.out.println("是否中斷2 " + myThread.isInterrupted()); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("main end"); }
輸出結(jié)果:
結(jié)果很明顯,因為 isInterrupted() 不具有清除狀態(tài)標記功能,所以兩次都輸出 true。
參考文章:http://www.cnblogs.com/hapjin...
歡迎關(guān)注微信公眾號「不只Java」,后臺回復「電子書」,送說不定有你想要的呢
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72491.html
摘要:合理中斷線程合理中斷在類中提供了和方法這三個方法分別是用來結(jié)束暫停恢復線程但是都已經(jīng)被標記為廢棄了因為一個線程不應該由其他線程來結(jié)束他應該收到別人的通知然后自己在合適的位置結(jié)束如果不合理的結(jié)束會導致很多意外的結(jié)果比如臨界區(qū)還沒完全操作完提前 合理中斷線程 合理中斷 在Thread類中,提供了stop(),suspend()和resume()方法,這三個方法分別是用來結(jié)束,暫停,恢復線程...
摘要:線程中斷線程中斷就是一種協(xié)作機制。它并不會真正的中斷一個正在運行的線程,而只是發(fā)出中斷請求,然后由線程在下一個合適的時刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務并處理隊列中的任務 SHUTDOWN:不接收新的任務,但是處理隊列中的任務 STOP:不接收新的任務,不處理隊列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的線程數(shù)是0 TER...
摘要:現(xiàn)在終止一個線程,基本上只能靠曲線救國式的中斷來實現(xiàn)。中斷機制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設(shè)置一個中斷狀態(tài)清除一個中斷狀態(tài)方法同時會返回線程原來的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執(zhí)行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
摘要:接口接口允許我們在線程執(zhí)行的時候有返回值,以及拋出異常線程的停止類中的個停止方法三者區(qū)別將線程標記為中斷返回線程當前的中斷狀態(tài),不清除線程的中斷標記返回線程當前的中斷狀態(tài),并清除線程的中斷標記與本質(zhì)都是調(diào)用了的。 1、通過繼承Thread類 public static class MThread extends Thread{ @Override public voi...
摘要:表示一個異步任務的結(jié)果,就是向線程池提交一個任務后,它會返回對應的對象。它們分別提供兩個重要的功能阻塞當前線程等待一段時間直到完成或者異常終止取消任務。此時,線程從中返回,然后檢查當前的狀態(tài)已經(jīng)被改變,隨后退出循環(huán)。 0 引言 前段時間需要把一個C++的項目port到Java中,因此時隔三年后重新熟悉了下Java。由于需要一個通用的線程池,自然而然就想到了Executors。 用了...
閱讀 3869·2021-10-08 10:05
閱讀 2950·2021-09-27 13:57
閱讀 2685·2019-08-29 11:32
閱讀 1010·2019-08-28 18:18
閱讀 1292·2019-08-28 18:05
閱讀 1989·2019-08-26 13:39
閱讀 868·2019-08-26 11:37
閱讀 2047·2019-08-26 10:37