我有一个可以多次调用的观察者。如果观察者的 onChange
方法仍在运行,则应等待第二个调用并忽略后续调用。
我用过这个:
Semaphore semaphore = new Semaphore(2,false);
...
public void onChange() {
if (!semaphore.tryAcquire()) return;
synchronized (semaphore) {
// do your stuff
semaphore.release();
}
}
这样可以吗?有没有更好的办法?
最佳答案
我觉得你的逻辑不错。在我阅读它时,2 个线程将能够以任何顺序获取 Semaphore
。任何其他试图获取的线程都将返回并被忽略。
第一个执行synchronized
的线程将阻塞另一个线程,因此只有一个线程会工作,一个(最大)线程会等待。一旦作业完成并且 release()
被调用,那么另一个线程将被允许进入信号量。一旦 synchronized
block 完成,第一个等待线程将开始工作。
另一种方法是使用两个 Semaphore
对象,第二个对象执行 acquire
而不是 tryAcquire
。但您的方式应该可行。
正如@herschel 所指出的,我会围绕“做你的事情”做一个try/finally
来保证信号量被释放。像这样的东西:
...
synchronized (semaphore) {
try {
// do your stuff
} finally {
semaphore.release();
}
}
关于java - 允许一个线程运行,一个等待,然后丢弃其他线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094577/