2013-05-01 72 views
2

我只是想知道如果這個線程是中斷或如果我正確地做對了嗎? 請給我暗示,如果我錯了檢查線程是否中斷?

public void run(){ 
    int i; 
    while(!Thread.currentThread().isInterrupted()){ 
    for(i=1;i<=100;i++){ 

     System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i); 

     if(i==3){ 
     Thread.currentThread().interrupt(); 
     gotoInform(); 
     break; 
     } 
     try{ 
     Thread.currentThread().sleep(1000);////to sleep the Thread for 1 Second (1000ms) 
     } 
     catch(Exception e){    
     System.out.printf("Error"+e);    
     } 
    } 
    } 
+2

我不確定這段代碼有多大意義。當你調用currentThread()。interrupt()時,你顯然不會中斷它的阻塞操作。所有這些都會設置''interrupt'標誌,只有在'for'循環結束後纔會檢查它。 – millimoose 2013-05-01 18:59:27

+0

從基礎開始:你想完成什麼?你有沒有試過運行你的代碼?它有什麼作用?它與你希望做的有什麼不同? – millimoose 2013-05-01 19:01:12

+0

對不起,我不能讓你請你容易解釋嗎? – 2013-05-01 19:01:25

回答

6

這是錯誤的,因爲如果sleep發現該線程被中斷,它會拋出一個InterruptedException並清除中斷標誌。然後吞下該異常,抑制該線程曾被中斷的任何記錄。相反,你應該寫更多的東西是這樣的:

public void run(){ 
    for(int i=1;i<=100;i++){ 

     System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i); 

     if(i==3){ 
      Thread.currentThread().interrupt(); 
      gotoInform(); 
      break; 
     } 
     try{ 
      Thread.currentThread().sleep(1000); 
     } 
     catch(final Exception e){ 
      e.printStackTrace(); 
      if(e instanceof InterruptedException) { 
       // just in case this Runnable is actually called directly, 
       // rather than in a new thread, don't want to swallow the 
       // flag: 
       Thread.currentThread().interrupt(); 
      } 
      return; 
     } 
    } 
} 

(注:我假設,這不是「真實」的代碼,而是,你只是想學習線程中斷是如何工作的。 「真正」的代碼,你幾乎從不需要以這種方式中斷當前的線程。)

+0

它會停止/或殺死當前線程安全,當然?我的意思是,這是任何線程使用任何標誌/值點停止/中斷的好方法? – 2013-05-01 19:06:08

+0

看起來像代碼將永遠不會進入睡眠,如果它自我中斷。如果_other_線程中斷這個線程,那麼它將工作。這樣做總是一個好主意。 +1。 – Gray 2013-05-01 19:06:57

+0

它仍然中斷異常!我應該爲它做些什麼,它仍然拋出中斷的異常? – 2013-05-01 19:09:33

0

我只是想知道如果這個線程是中斷或如果我做對了嗎?

@ruakh是正確的,這是總是一個好主意,重新中斷線程一旦InterruptedException被拋出。但是,如果您的代碼的目標是自我中斷,並且其他線程不會中斷正在運行的線程,那麼在線程中斷後調用break;,您將永遠無法訪問sleep()調用。

如果線程始終只是自我中斷,那麼我只會使用一個標誌。喜歡的東西:

boolean done = false; 
while (!done) { 
    ... 
    if(i==3){ 
     done = true; 
     ... 
    } 
} 

即使你打斷你的線程,然後調用gotoInform()可以致電wait()sleep()本身並導致InterruptedException。你需要確保代碼行爲良好,如果有的話重新中斷線程。

1

如前所述,中斷自身的線程是毫無意義的(除非在捕獲InterruptedException後用於重新中斷自身)。你基本上在這裏使用線程的內部中斷標誌作爲條件變量 - 雖然它可能工作並不完全是它應該被使用的,並且會讓需要閱讀代碼的其他人感到困惑。如上所示,使用循環計數器來使代碼更清潔。

而且,你的說法:

System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i); 

是錯誤的,因爲它會通過迴路立即執行第一次(當時間接近零秒)。