app*_*ion 7 java concurrency multithreading
我是Java并发/多线程的新手.有人可以向我解释在什么情况下,必须(或不得)使用acquire()和acquireUninterruptibly(),它们是如何不同的; 以及如何使用它们(代码示例?).
非常感谢你.
acquire()是可中断的。这意味着如果线程 A 正在调用acquire()信号量,而线程 B 通过调用中断线程 A interrupt(),则InterruptedException在线程 A 上抛出。
另一方面acquireUninterruptibly()是不可中断的。这意味着如果线程 A 正在调用acquireUninterruptibly()信号量,并且线程 B 通过调用中断线程 A interrupt(),则不会InterruptedException在线程 A 上抛出no ,只是该线程 A 将在acquireUninterruptibly()返回后设置其中断状态。
根据文档:
两种方法都从信号量获取许可并阻塞,直到其中一种方法可用为止。但是 acquire() 方法会被中断,这意味着它会阻塞,直到线程被中断并抛出 Interrupted 异常(已检查)。
但是,当线程被中断时,acquireUninterruptically()不起作用,它会保持阻塞状态,直到获得信号量的许可。
来源: https: //docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquireUninterruptically()