Java 中断异常是否会导致线程停止

Java 中断异常是否会导致线程停止,java,multithreading,Java,Multithreading,我认为如果抛出异常,当前正在执行的线程将被阻塞。Bu在进行java测试时,我遇到了一个问题: 当前执行的线程在什么情况下停止 当发生中断的异常时 当具有较高优先级的线程准备就绪时(变为可运行) 当线程创建新线程时 调用stop()方法时 A.1和3 B.2和4 C.1和4 D.2和3 正确的答案是B,但是如果抛出异常会发生什么呢?我以为线程正在终止 正确答案是B 不,不是。给出的答案没有一个是正确的 但是如果抛出异常会发生什么呢?我以为线程正在终止 否。线程从它调用的任何可以抛出它的方法捕获In

我认为如果抛出异常,当前正在执行的线程将被阻塞。Bu在进行java测试时,我遇到了一个问题:

当前执行的线程在什么情况下停止

  • 当发生中断的异常时

  • 当具有较高优先级的线程准备就绪时(变为可运行)

  • 当线程创建新线程时

  • 调用stop()方法时

  • A.1和3

    B.2和4

    C.1和4

    D.2和3

    正确的答案是
    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
    对线程的影响与任何选中的异常没有任何区别,这意味着它本身不能导致线程停止。。