2012-10-22 210 views
0

我想要一个Java中的Mutex,它让我在一个线程中等待它,并在另一个线程中释放它。我知道我可以使用容量为1的信号量,但问题是“acquire()”方法会抛出“InterruptedException”。在Java中有什么特别的同步方式可以达到这个目的吗?Java中互斥线程的互斥量?

+0

为什么中断的异常可能会被抛出? –

+0

在任何旧对象上使用同步块都有问题吗? – Wug

+0

@enno Shioji:我想确保我可以获得许可证! – moorara

回答

3

幸运的是,信号量提供了这种方法对你:)

public void acquireUninterruptibly()

从此信号量获取许可证,阻塞,直到有一个是可用的 。获取许可证(如果有),并立即返回 ,将可用许可证的数量减少一个。

如果没有许可证是可用的,则当前线程用于 线程调度目的,禁止,直到其他线程 调用此信号量和当前线程 是下一个要被分配许可的释放()方法处于休眠状态。

如果在等待许可,然后 它将继续等待当前线程被中断,但在该线程分配 时间的许可证可以改变相比,它会接收到的时间的 许可证没有发生中断。当线程从 这个方法返回时,其中断状态将被设置。

0

如果你有一个线程将要等待的代码,那么除非你使用同步块,否则你一定要处理中断的异常。另外,中断异常有什么问题?

1

InterruptedException不是问题,只是把它包在一个循环:

while(true) { 
    try { 
     semaphore.acquire(); 
     break; 
    } catch(InterruptedException e) { 
     //swallow, continue; 
    } 
} 

但是这个代码是不是很安全,优雅,但将努力为您提供您“要确保你能获得允许!

+0

如果在catch子句中完成Thread.currentThread()。interrupt(),我会说它几乎是处理这个问题的最好方法(除了使用acquireUninterruptibly方法)。 –

0

的ThreadA

volatile boolean waitCondition = true 

synchronized(lockObject) { 
    while (waitContidion) { 
    lockObject.wait(); 
    } 
} 

ThreadB

synchronized(lockObject) { 
    waitCondition = false; 
    lockObject.notifyAll(); 
} 

或锁定实例使用条件/信号。

InterruptedException的正确处理是非常重要的,至少你必须设置它的中断标志与Thread.currentThread()。中断()在catch块的方法。