2012-04-22 61 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++)