Java 中的 InterruptedException 是什么?

Coo*_*SRS 0 java android interrupted-exception

我在代码中多次看到出现中断异常。我如何解决它?

例子:

for (int i = 0; i < readLimit; i++) {
    if (fileName.exists())
        return readFile(fileName);
        Thread.sleep(1000); // Here is where I get the error
    }
}
Run Code Online (Sandbox Code Playgroud)

fug*_*i61 5

由于我不知道您对Java了解多少、Java 到底如何工作以及什么是并发性,所以我将尝试尽可能多地解释,几乎不需要任何背景信息。


首先,我们将看一下 Oracle 的InterruptedException.

当线程正在等待、休眠或以其他方式占用,并且线程在活动之前或活动期间被中断时抛出。[...]


这是什么意思?

在回答这个问题之前,您必须初步了解 a 的Thread工作原理。

线程本来只是一段可以与其他线程分开管理的代码。它可以同时运行(请参阅并发)、按计划运行等。


例子

如果你启动一个普通的java程序,该main()方法是在一个自己的线程1中创建的。你所做的一切都将在这个线程中执行。您创建的每个类、您调用的每个方法以及基本上源自main().

但如果你创建一个Thread,它会在自己的线程 2 中运行。你在该run()方法中所做的一切都将在线程 2 中执行。


如果创建一个新的会发生什么Thread

join()方法被调用。

join()方法启动线程并run()正在执行。

不仅有join()不带参数的方法,还有join(long millis)带参数的方法。


何时以及为何抛出它?

正如拉胡尔·艾耶(Rahul Iyer)所说,原因有很多。我挑选了其中一些,以便让您在被召唤时有一种感觉。

  1. 暂停

InterruptedException当超过超时时确实可以抛出。当 被调用时就会发生这种情况join(long millis)。该参数指定线程可以运行给定的毫秒数。当线程超过此超时时,它将被中断。(从第 769 行到第 822 行)。

  1. 操作系统正在停止线程

也许操作系统(Windows、Linux、Android 等决定停止该程序。为什么?为了释放资源,你的程序被误认为是病毒,硬件正在关闭,用户手动关闭它等。

  1. 抛出 InterruptedExceptionThread

    例如,您已连接到互联网并正在阅读某些内容,但互联网突然断开。

  2. interrupt()叫做

    正如已经提到的,当您调用anyInterruptedException时,也会抛出an (非常合乎逻辑)。interrupt()Thread


怎么处理呢?

您可以/应该像处理其他异常一样处理它。将它包装在tryand中catch,声明它的方法throws,记录它,等等。

这可能是最适合您的资源:Handling InterruptedException in Java