我认为如果抛出异常,当前正在执行的Thread会被调用。当我经历一次java测试时遇到了一个问题:
当前正在执行的线程将在哪些条件下停止?
发生中断的异常时。
当优先级较高的线程准备就绪(变为可运行)时。
当线程创建新线程时。
- 醇>
调用stop()方法时。
一个。 1和3
B中。 2和4
℃。 1和4
d。 2和3
正确答案是B
,但如果抛出异常会怎么样?我以为线程正在终止。
答案 0 :(得分:3)
正确答案是B
不,不是。 无给出的答案是正确的。
但是如果抛出异常会发生什么?我以为线程正在终止。
没有。该线程从它调用的任何可以抛出它的方法中捕获InterruptedException
,例如Thread.sleep()
。如果它没有调用这样的方法,则根本不会发生任何事情。
答案 1 :(得分:2)
当一个方法抛出InterruptedException时,它告诉它是一个阻塞方法并且它会尝试解除阻塞并提前返回 - 如果你问得好的话。
当您尝试通过调用线程实例上的interrupt()来中断线程时,它只发送一个信号。它取决于响应该信号的实际线程。像Thread.sleep()和Object.wait()这样的方法可以查找此信号,并尝试停止它正在做的事情并提前返回, 表示其早期返回 通过抛出InterruptedException。所以它通常是从某些阻塞方法确认到某个其他线程发送的interrupt()请求。
Thread t = new Thread(() -> {
try {
Thread.sleep(5000); // Thread.sleep() allows a cancellation mechanism
} catch (Exception e) {
System.out.println("interrupted by some one else from outside");
}
});
t.start();
try {
t.interrupt();
t.join(); // waiting for the thread to finish its execution
System.out.println("back in main");
} catch (InterruptedException e) {
System.out.println("interrupted");
}
输出:
interrupted by some one else from outside
back in main
但如果你有这样的话题
Thread t = new Thread(() -> {
try {
for(int i=0;i<1_000_000;i++){
System.out.println(i);
}
} catch (Exception e) {
System.out.println("interrupted by some one else from outside");
}
});
在上面的线程上调用interrupt()不会有用,因为我们没有查找信号,所以线程将打印所有数字并加入主线程,好像没有人要求它停止做它正在做的事情。
如果您想了解有关此InterruptedException的更多信息,我强烈推荐来自IBM Developer Works的this Brian Goetz的文章
答案 2 :(得分:1)
如果其他线程调用t
,则线程t.stop()
将停止,但请不要这样做!一个线程永远不应该强制另一个线程做任何事情。线程应始终合作。任何调用t.stop()的程序都很可能包含在不删除stop()调用的情况下无法修复的错误。
如果某个外部进程杀死JVM,线程将终止(这是一种停止,对吧?)。
如果JVM关闭,守护程序线程将终止,因为没有任何非守护程序线程可以保持活动状态。
由于附加调试器的操作,线程可能会停止或终止。
线程停止(和终止)的另一个原因是它的run()
方法完成。方法可以通过返回完成正常,也可以异常终止 (即,在方法调用中抛出并且未捕获异常)。如果一个线程的run()方法以任何一种方式完成,它将终止。
InterruptedException不会影响任何其他异常的线程。如果线程捕获异常,那么线程将继续运行,但如果线程中没有方法捕获它,那么线程的run()方法将异常完成,并且线程将终止(停止)。击>