当前位置: 首页 > 知识库问答 >
问题:

中断线程本身

涂泰平
2023-03-14
public static void main(String[] args) {
    MyThread t = new MyThread();
    t.start();
    try {
        t.join();
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}

private static class MyThread extends Thread {

    @Override
    public void run() {
        Thread.currentThread().interrupt();
    }
} }

如果这个线程在对象类的wait()、wait(long)或wait(long,int)方法的调用中被阻塞,或者在该类的thread.join()、thread.join(long)、thread.join(long,int)、thread.sleep(long)或thread.sleep(long,int)方法的调用中被阻塞,那么它的中断状态将被清除,并且它将收到一个interruptedexception。

共有1个答案

胡俊美
2023-03-14

我知道这是一个老问题,但我认为上面的答案实际上不太正确。(除了@skylion's,它并没有真正解决这个问题...):)

thread.interrupt()本身不引发任何异常。它做两件事:首先,它简单地设置一个内部中断标志,然后检查调用它的线程当前是否阻塞了类似wait()sleep()join()的活动。如果它找到了一个,那么它就会唤醒该方法,并使该方法在它被调用的线程(而不是从它调用的线程)内部抛出异常。

在从线程本身调用interrupt()的情况下,该线程本身显然不可能当前阻塞其中一个调用,因为它当前正在执行interrupt()调用。因此,只设置内部中断标志,并且根本不抛出异常。

public static void main(String[] args) {
    MyThread t = new MyThread();
    t.setDaemon(true);  // Quit when main thread is done
    t.start();
    try {
        t.join();
    } catch (InterruptedException ex) {
        System.out.println("Now it works:");
        ex.printStackTrace();
    }
}

private static class MyThread extends Thread {
    
    private final Thread parentThread;
    
    public MyThread() {
        parentThread = Thread.currentThread();
    }

    @Override
    public void run() {
        parentThread.interrupt();  // Call on main thread!!!
        while (true);  // Keep thread running (see comments)
    }
}
 类似资料:
  • 很多情况下,使用信号来终止一个长时间运行的线程是合理的。这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户显式的取消了这个任务,亦或其他各种原因。不管是什么原因,原理都一样:需要使用信号来让未结束线程停止运行。这里需要一种合适的方式让线程主动的停下来,而非让线程戛然而止。 你可能会给每种情况制定一个独立的机制,这样做的意义不大。不仅因为用统一的机制会更容易在之后的场景中实现,而且写出来

  • 在下面的代码中,javascript运行在与主线程不同的单独线程中。该脚本是一个无限循环,因此需要以某种方式终止。怎样 使命感脚本开始运行后,cancel()不起作用。但如果我打电话。cancel()在线程初始化之后,它将终止它(注释掉的行)。

  • 问题内容: 在下面的代码中,我使javascript在与主要线程不同的线程中运行。该脚本是一个无限循环,因此需要以某种方式终止。怎么样? 脚本开始运行后,调用.cancel()无效。但是,如果我在线程初始化之后立即调用.cancel(),它将终止它(注释行)。 问题答案: 与Java一样,JavaScript(在Nashorn下)也不会像Java那样在紧密循环中响应中断。该脚本需要轮询中断并自动终

  • 问题内容: 我正在构建一个同时侦听TCP和UDP的应用程序,并且我的关机机制遇到了一些麻烦。当我在每个侦听线程上调用时,TCP线程会因侦听而中断,而UDP侦听器则不会。具体来说,TCP线程使用,它只是返回(没有实际连接)。UDP线程使用,而不会退出该方法。 这是我的JRE,操作系统中的问题,还是我应该切换到? 更新:我已经找到问题的分析。它确认行为不一致。 问题答案: 中断网络IO的常见习惯是关闭

  • 问题内容: 使用return by时,如何中断它? 问题答案: 为此,您需要将任务分配给,而不是调用。当您执行此操作时,将返回一个可用于操纵计划任务的a。特别是,您可以调用关联程序来中断当前正在执行的任务(或者,如果该任务尚未开始运行,则完全跳过执行)。 顺便说一句,由返回的对象实际上是个。