2012-04-22 59 views
2

我有這段代碼:Java 6的線程中斷

public class ThreadInteraction { 
     public static void main(String[] argv) { 
     System.out.println("Create and start a thread t1, then going to sleep..."); 
     Thread1 t1 = new Thread1(); 
     t1.start(); 


     try{ 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e) { 
      System.out.println(e.toString()); 
     } 

      //let's interrupt t1 
      System.out.println("----------- Interrupt t1"); 
     t1.interrupt(); 

     for(int i =0; i<100; i++) 
      System.out.println("Main is back"); 
    } 
} 

class Thread1 extends Thread { 
     public void run() { 
     for(int i =0; i<10000; i++) 
       System.out.println(i + "thread1"); 
     } 
} 

好像t1.interrupt()在我所有的輸出10000 T1打印出的文字不起作用。難道我做錯了什麼?

回答

5

Thread.interrupt()實際上不會停止任何東西。此方法僅用於設置線程的中斷狀態,但您必須檢查它。這是你應該如何組織你的代碼,以使其工作:

public void run() { 
    for (int i = 0; i < 10000; i++) { 
     if (interrupted()) break; 
     System.out.println(i + "thread1"); 
    } 
} 

Thread.interrupted()這裏清除中斷狀態,因爲我們直接控制線程這是確定。如果嘗試檢測中斷,例如,在線程池的其中一個線程上運行的java.util.concurrent. Callable中,則最好使用Thread.currentThread().isInterrupted();,因爲您不知道線程中斷策略。

1

Thread.interrupt只會導致目標線程停止,如果它是在非常特殊的狀態:

首先該線程的checkAccess方法被調用,這可能導致拋出SecurityException。

如果此線程在Object類或join()的wait(),wait(long)或wait(long,int)方法的調用中被阻塞,則join(long),join long,int),sleep(long)或sleep(long,int)這兩個類的方法,那麼它的中斷狀態將被清除,並且會收到一個InterruptedException異常。

如果此線程在可中斷通道的I/O操作中被阻塞,則通道將被關閉,線程的中斷狀態將被設置,並且線程將收到ClosedByInterruptException。

如果此線程在選擇器中被阻塞,那麼線程的中斷狀態將被設置,並且它將立即從選擇操作中返回,可能具有非零值,就像調用選擇器的喚醒方法一樣。

如果前面的條件都不成立,那麼該線程的中斷狀態將被設置。

你需要檢查isInterrupted在你的線程,如果你希望它早日退出這個循環。

for(int i =0; i<10000 && !isInterrupted(); i++)