何时使用java.util.concurrent.Semaphore的acquire()和acquireUninterruptibly()方法?

app*_*ion 7 java concurrency multithreading

我是Java并发/多线程的新手.有人可以向我解释在什么情况下,必须(或不得)使用acquire()和acquireUninterruptibly(),它们是如何不同的; 以及如何使用它们(代码示例?).

非常感谢你.

Chi*_*hin 7

acquire()是可中断的。这意味着如果线程 A 正在调用acquire()信号量,而线程 B 通过调用中断线程 A interrupt(),则InterruptedException在线程 A 上抛出。

另一方面acquireUninterruptibly()是不可中断的。这意味着如果线程 A 正在调用acquireUninterruptibly()信号量,并且线程 B 通过调用中断线程 A interrupt(),则不会InterruptedException在线程 A 上抛出no ,只是该线程 A 将在acquireUninterruptibly()返回后设置其中断状态。


Shi*_*arg 4

根据文档:

两种方法都从信号量获取许可并阻塞,直到其中一种方法可用为止。但是 acquire() 方法会被中断,这意味着它会阻塞,直到线程被中断并抛出 Interrupted 异常(已检查)。

但是,当线程被中断时,acquireUninterruptically()不起作用,它会保持阻塞状态,直到获得信号量的许可。

来源: https: //docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquireUninterruptically()