InterruptException是否导致线程停止

时间:2015-01-24 07:14:38

标签: java multithreading

我认为如果抛出异常,当前正在执行的Thread会被调用。当我经历一次java测试时遇到了一个问题:

  

当前正在执行的线程将在哪些条件下停止?

     
      
  1. 发生中断的异常时。

  2.   
  3. 当优先级较高的线程准备就绪(变为可运行)时。

  4.   
  5. 当线程创建新线程时。

  6.   
  7. 调用stop()方法时。

  8.         

    一个。 1和3

         

    B中。 2和4

         

    ℃。 1和4

         

    d。 2和3

正确答案是B,但如果抛出异常会怎么样?我以为线程正在终止。

3 个答案:

答案 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()方法将异常完成,并且线程将终止(停止)。