2

我有这段代码:

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 打印。难道我做错了什么?

4

2 回答 2

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();因为您不知道线程中断策略。

于 2012-04-22T09:42:41.820 回答
1

Thread.interrupt只有在非常特定的状态下才会导致目标线程停止:

首先调用该线程的 checkAccess 方法,这可能会导致抛出 SecurityException。

如果该线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 时被阻塞, sleep(long), or sleep(long, int), 这个类的方法,那么它的中断状态会被清除并且会收到一个InterruptedException。

如果此线程在可中断通道上的 I/O 操作中被阻塞,则通道将关闭,线程的中断状态将被设置,并且线程将收到 ClosedByInterruptException。

如果该线程在 Selector 中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能带有非零值,就像调用了选择器的唤醒方法一样。

如果前面的条件都不成立,则将设置该线程的中断状态。

isInterrupted如果您希望线程提前退出该循环,则需要检查您的线程。

for(int i =0; i<10000 && !isInterrupted(); i++)
于 2012-04-22T09:42:17.187 回答