java - 处理 InterruptedException 的最佳实践

标签 java exception concurrency

<分区>

在业务场景中,InterruptException多次出现,有的出现在业务代码执行之前,有的出现在业务代码之后。如何处理 InterruptException 让我很困惑。

1. preBusiness code semaphore.acquire()

        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
           // do something
        }
        resObj = caller.stepTry();
        semaphore.release();
  1. postBusiness代码 latch.await(), service.take().get()

    CompletionService<CallableResultBO> service = new ExecutorCompletionService<>(executor);
    CountDownLatch latch = new CountDownLatch(size);
    
    for (R callable : listCall){
        callable.setCountParam(JdkThreadCountBO.buildByLatch(latch));
        service.submit(callable);
    }
    
    try {
        latch.await();
    } catch (InterruptedException e) {
        // do something
    }
    
    CallableResultBO[] resArr = new CallableResultBO[size];
    for ( int i = 0; i < size; i++ ){
        try {
            resArr[i] = service.take().get();
        } catch (InterruptedException e) {
            // do something
        } catch (ExecutionException e) {
            // do something
        }
    }
    

    实践中也发现了一些疑点,目前还在思考如何下结论。 一个线程不能随便中断。即使我们为线程设置了中断状态,它仍然可以获得CPU时间片。通常只有被sleep()方法阻塞的线程才能立即收到InterruptedException,所以在 sleep 中断任务的情况下,可以使用try-catch跳出任务。其他情况需要通过判断线程状态来判断任务是否需要跳出(Thread.interrupted()方法)。

    另外,synchronized方法修改的代码在收到中断信号后不会立即中断。 ReentrantLock锁控件的同步代码可以被InterruptException中断。

最佳答案

通常,建议您执行以下操作:

    void methodThatWaits()
    {
        try 
        {
            Thread.sleep( 1000 );
        }
        catch( InterruptedException e )
        {
            //e.printStackTrace();
            Thread.currentThread().interrupt();
        }
    }

所以,不,Thread.currentThread().interrupt(); 不是多余的。

这被称为 Java Thread.currentThread().interrupt 惯用语Java 并发实战,第 7.1.3 章对其进行了详细解释。 Effective Java 中也提到了它,您可以在此处阅读摘录:Google Books - Effective Java - search for java idiom thread interrupt interruptedexception josh bloch

关于java - 处理 InterruptedException 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52622554/

相关文章:

exception - MonoTouch 的 UIViewControllerHierarchy 不一致异常

Java ExecutionrCompletionService take.get() 从不同的线程

java - 如何为并发类编写正确性测试?(2个 Action 不是并行执行的)

c# - 在并行任务与异步任务上使用 Task.Wait

java - Hadoop:应该映射什么,应该减少什么?

java - 如何使用正则表达式将字符串从一种模式转换为另一种模式?

java - 捕获组中的可选子字符串

haskell - 在 Haskell 中执行一系列操作时的异常处理

c++ - "break when an exception is void"是什么意思?

java - 了解内核在 udp 套接字上分配的本地地址