gpt4 book ai didi

java - 允许一个线程运行,一个等待,然后丢弃其他线程

转载 作者:行者123 更新时间:2023-11-30 11:47:52 26 4
gpt4 key购买 nike

我有一个可以多次调用的观察者。如果观察者的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com