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。
我知道这是一个老问题,但我认为上面的答案实际上不太正确。(除了@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。特别是,您可以调用关联程序来中断当前正在执行的任务(或者,如果该任务尚未开始运行,则完全跳过执行)。 顺便说一句,由返回的对象实际上是个。