java - 在加入其他线程时被打断

标签 java multithreading join exception-handling concurrency

我应该如何在加入其他线程时处理 InterruptedException,假设我实际上没有预料到会被打断,并且没有明智的做法?吞下异常?

try
{
    t.join();
    u.join();
}
catch (InterruptedException e)
{
    // should not happen
}

或者我应该将每个 join 放在其单独的 try/catch 中,这样如果 InterruptedExeption 确实 发生了在加入 t 时,至少 u 有机会被加入?

try
{
    t.join();
}
catch (InterruptedException e)
{
    // should not happen
}
try
{
    u.join();
}
catch (InterruptedException e)
{
    // should not happen
}

或者我应该防御性地吞下一个循环中的异常,这样我最终会加入两个线程,即使一些恶意的人试图打断我?

while (true)
{
    try
    {
        t.join();
        break;
    }
    catch (InterruptedException e)
    {
        // no way, Jose!
    }
}
while (true)
{
    try
    {
        u.join();
        break;
    }
    catch (InterruptedException e)
    {
        // no way, Jose!
    }
}

附带说明一下,有没有 InterruptedExeption 不会让我的代码看起来难看的情况? :)

最佳答案

如果某些事情不应该发生,您可能想知道它是否曾经确实发生过 - 让它显而易见的最好方法通常是抛出一个 RuntimeException一些描述(例如 IllegalStateException)。如果你没有预料到被打断的可能性,这表明系统处于你不太乐意支持的状态,所以我不会尝试继续前进——快速中止通常是最好的选择。

您可能想编写一个辅助方法来为您执行此操作,以使调用代码更清晰。

关于java - 在加入其他线程时被打断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265656/

相关文章:

mysql - 连接和组合多个表 MYSQL

java - 缩短命令行的类路径 (-cp)

java - 如何在不安装 jdk 或 jre 的情况下运行 java 应用程序文件(exe 而不是 jar)

java - 我可以要求 JDBCTemplate 扩展列表参数以在 in() 子句中使用吗?

c++ - 为什么add函数在c++ 11线程中没有效果?

c++ - 通过接受关闭在另一个线程中使用的套接字的风险是什么?

sql - Postgres/netezza 从多个表进行多重连接

java - 从 String ArrayList 获取输入并输出新字符串

multithreading - Delphi线程最佳实践

mysql - JPQL从多个表中获取数据