如果我不干扰任何东西,我需要担心InterruptedException吗?

12 浏览
0 Comments

如果我不干扰任何东西,我需要担心InterruptedException吗?

我在一个业余项目中使用java.util.concurrent.Semaphore。它在我编写的连接池类中使用。我可以很轻松地使用它,除了这个方法:public void acquire(int permits) throws InterruptedException,它强制我处理InterruptedException异常。现在,我不确定\"中断\"一个线程意味着什么,而且我从未在我的代码中明确地这样做过。这是否意味着我可以忽略这个异常?我应该如何处理它?

0
0 Comments

线程可以通过调用Thread.interrupt()来进行中断。它用于优雅地向线程发出信号,告知它应该做其他事情。通常情况下,它会导致阻塞操作(例如Thread.sleep())提前返回并抛出InterruptedException异常。如果线程被中断,会在其上设置一个标志。可以通过Thread.isInterrupted()方法查询该标志。

如果您不使用线程中断,但仍然遇到InterruptedException异常,您可以简单地退出线程(最好记录异常)。

这取决于您的多线程应用程序的具体操作。

在多线程应用程序中,如果没有自己使用线程中断,为什么还会出现InterruptedException异常呢?这个问题的出现可能有以下原因:

1. 第三方库或框架使用了线程中断机制,导致您的线程被中断。

解决方法:检查您使用的第三方库或框架的文档,了解其是否使用了线程中断机制,并相应地处理中断异常。

2. 您的代码中存在阻塞操作,例如Thread.sleep(),而其他线程调用了您的线程的interrupt()方法。

解决方法:在调用阻塞操作之前,检查Thread.isInterrupted()方法的返回值,如果返回true,则退出线程。

下面是一个示例代码,演示了如何处理InterruptedException异常:

public class MyThread extends Thread {
    public void run() {
        try {
            while (!Thread.currentThread().isInterrupted()) {
                // 执行一些操作
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("Thread interrupted");
            // 退出线程
            return;
        }
    }
}

在上述代码中,通过检查Thread.currentThread().isInterrupted()方法的返回值,可以判断线程是否被中断。如果线程被中断,则会抛出InterruptedException异常,我们可以在catch块中处理该异常,然后退出线程。

,如果您没有自己使用线程中断机制,但仍然遇到InterruptedException异常,应该检查是否有第三方库或框架使用了线程中断,并相应地处理中断异常。另外,在存在阻塞操作的代码中,应该在执行阻塞操作之前检查线程的中断状态,并在发生中断时退出线程。

0
0 Comments

如果我不主动中断任何东西,我需要担心InterruptedException吗?

不需要。只有在您自己中断线程时才会生成InterruptedException。如果您不使用Thread.interrupt(),那么我会将其重新抛出为某种"意外异常",或者将其记录为错误并继续执行。例如,在我的代码中,当我被迫捕获InterruptedException并且我从未调用过interrupt()时,我会执行以下等效操作:

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

这是如果中断是意外的情况。有很多地方我会故意中断我的线程,在这些情况下,我会以明确定义的方式处理InterruptedException。通常情况下,我会退出当前循环,清理资源,然后停止线程。

0
0 Comments

在Java中,如果一个线程被中断,它将抛出InterruptedException异常。当一个线程调用Thread.sleep()、Object.wait()或Thread.join()方法时,如果另一个线程中断了它,就会抛出这个异常。因此,即使你自己没有显式地中断线程,你仍然需要担心InterruptedException异常。

通常情况下,InterruptedException意味着停止请求,很可能是因为运行你代码的线程被中断了。在一个连接池等待获取连接的情况下,这可能是一个取消问题,你需要中止获取、清理并恢复中断标志。

举个例子,如果你在一个Executor中运行一个Runnable/Callable,你需要正确处理InterruptedException:

executor.execute(new Runnable() {
    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  continue; //blah
              }
              pingRemoteServer();
         }
    }
});

这意味着你的任务不遵守Executor使用的中断机制,也不允许正确的取消/关闭操作。相反,正确的做法是恢复中断状态然后停止执行:

executor.execute(new Runnable() {
    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  Thread.currentThread().interrupt(); //恢复中断状态
                  break;
              }
              pingRemoteServer();
         }
    }
});

如果你想了解更多信息,可以参考以下有用的资源:

- Shutting down threads cleanly (Java Specialists): http://www.javaspecialists.co.za/archive/Issue056.html

- Dealing with InterruptedException (Brian Goetz): http://www.ibm.com/developerworks/java/library/j-jtp05236.html

即使你没有自己中断线程,你仍然需要担心InterruptedException异常。当线程在sleep、wait或join时被中断,就会抛出这个异常。为了正确处理这个异常,你可以恢复中断状态并停止执行。

0