Java 中断异常是否会导致线程停止
我认为如果抛出异常,当前正在执行的线程将被阻塞。Bu在进行java测试时,我遇到了一个问题: 当前执行的线程在什么情况下停止Java 中断异常是否会导致线程停止,java,multithreading,Java,Multithreading,我认为如果抛出异常,当前正在执行的线程将被阻塞。Bu在进行java测试时,我遇到了一个问题: 当前执行的线程在什么情况下停止 当发生中断的异常时 当具有较高优先级的线程准备就绪时(变为可运行) 当线程创建新线程时 调用stop()方法时 A.1和3 B.2和4 C.1和4 D.2和3 正确的答案是B,但是如果抛出异常会发生什么呢?我以为线程正在终止 正确答案是B 不,不是。给出的答案没有一个是正确的 但是如果抛出异常会发生什么呢?我以为线程正在终止 否。线程从它调用的任何可以抛出它的方法捕获In
B
,但是如果抛出异常会发生什么呢?我以为线程正在终止
正确答案是B
不,不是。给出的答案没有一个是正确的
但是如果抛出异常会发生什么呢?我以为线程正在终止
否。线程从它调用的任何可以抛出它的方法捕获
InterruptedException
,例如thread.sleep()
。如果它不调用这样一个方法,那么什么也不会发生。当一个方法抛出InterruptedException时,它告诉你它是一个阻塞方法,如果你问得好的话,它会尝试取消阻塞并提前返回
当您试图通过在线程实例上调用interrupt()来中断线程时,它只发送一个信号。它取决于实际线程对该信号的响应。像Thread.sleep()和Object.wait()这样的方法可以查找这个信号,并尝试停止它正在做的事情并提前返回,通过抛出InterruptedException来指示它的提前返回。因此,它通常是一些阻塞方法对其他线程发送的中断()请求的确认
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");
}
});
Thread t=新线程(()->{
试一试{
对于(int i=0;i如果其他线程调用t.stop()
,则线程,t
将停止,但请不要这样做!一个线程不应强制另一个线程执行任何操作。线程应始终协作。任何调用t.stop()的程序很可能包含无法修复的bug,而不清除stop()调用
如果某个外部进程杀死JVM,线程将终止(这是一种停止,对吗?)
如果JVM关闭,守护进程线程将终止,因为没有非守护进程线程可以让它保持活动状态
线程可能会因为附加的调试器的操作而停止或终止
线程将停止(并终止)的另一个原因是其run()
方法完成。方法可以通过返回正常完成,也可以异常终止(即抛出异常且未在方法调用中捕获)。如果其run()方法以任何一种方式完成,线程将终止
InterruptedException对线程的影响与任何其他异常没有任何区别。如果线程捕捉到异常,则线程将继续运行,但如果线程中没有方法捕捉到异常,则线程的run()方法将异常完成,线程将终止(stop)
方法,正如您所描述的那样。@EJP,嗯……很好。好吧,那么,InterruptedException
对线程的影响与任何选中的异常没有任何区别,这意味着它本身不能导致线程停止。。