Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我不';我自己不要打断任何事?_Java_Exception_Concurrency - Fatal编程技术网

Java 如果我不';我自己不要打断任何事?

Java 如果我不';我自己不要打断任何事?,java,exception,concurrency,Java,Exception,Concurrency,我正在一个业余项目中使用java.util.concurrent.Semaphore。它用于我正在编写的连接池类。除了这个方法外,我可以不费吹灰之力地使用它: public void acquire(int permits) throws InterruptedException 这迫使我处理中断异常。现在,我甚至不确定“中断”线程意味着什么,我从来没有在我的代码中这样做过(好吧,无论如何也不是显式的)。这是否意味着我可以忽略异常?我应该如何处理它?调用Thread.interrupt()可以

我正在一个业余项目中使用
java.util.concurrent.Semaphore
。它用于我正在编写的连接池类。除了这个方法外,我可以不费吹灰之力地使用它:

public void acquire(int permits) throws InterruptedException

这迫使我处理
中断异常
。现在,我甚至不确定“中断”线程意味着什么,我从来没有在我的代码中这样做过(好吧,无论如何也不是显式的)。这是否意味着我可以忽略异常?我应该如何处理它?

调用Thread.interrupt()可以中断线程。它用于优雅地向线程发出信号,表示它应该执行其他操作。通常,它会导致阻塞操作(例如Thread.sleep())提前返回并抛出InterruptedException。如果线程被中断,将在其上设置一个标志。可以通过Thread.isInterrupted()调用查询此标志

如果您不使用线程中断,但仍然得到此异常,则可以退出线程(最好记录此异常)

通常,这取决于多线程应用程序的功能。

在执行线程所需的任何清理后,应退出run()方法。

没有<代码>中断异常仅在您自己中断线程时生成。如果您自己不使用
Thread.interrupt()
,那么我要么将其作为某种“意外异常”重新抛出,要么将其记录为错误并继续。例如,在我的代码中,当我被迫捕获
InterruptedException
并且我自己从来没有调用
interrupt()
时,我会执行与

catch (InterruptedException exception) {
    throw new RuntimeException("Unexpected interrupt", exception);
}

如果这是意外的话。有很多地方我故意中断线程,在这些情况下,我以定义良好的方式处理
InterruptedException
s。通常这是通过退出我所处的任何循环,清理,然后停止线程。

如果您不知道如何在方法中处理它,我建议您使用throws InterruptedException(以及它的调用方等)在方法中声明它

如果它是您从未预料到的事情,我会捕获它并将其包装在断言错误中。

是的,您需要担心
中断异常
,就像您需要担心必须抛出或处理的任何其他已检查异常一样

大多数情况下,
InterruptedException
会发出停止请求的信号,这很可能是因为运行代码的线程被激活了

在连接池等待获取连接的特定情况下,我认为这是一个取消问题,您需要中止获取、清理并恢复中断标志(见下文)


例如,如果在执行器中运行某种类型的
Runnable
/
Callable
,则需要正确处理中断异常:

executor.execute(new Runnable() {

    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  continue; //blah
              }
              pingRemoteServer();
         }
    }
});
这意味着您的任务从不遵守执行者使用的中断机制,并且不允许正确的取消/关闭

相反,正确的习惯用法是恢复中断状态,然后停止执行:

executor.execute(new Runnable() {

    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  Thread.currentThread().interrupt(); // restore interrupted status
                  break;
              }
              pingRemoteServer();
         }
    }
});

有用的资源


绝对如此。有关更多信息,请参阅Java专家时事通讯,它不应该是Thread.currentThread().interrupt()而不是Thread.interrupted()?根据javadocs,Thread.interrupted()将清除中断标志,而不是设置它。