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();
}
}
});
有用的资源: