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

标签 java concurrency

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

相关文章:

Python 哈希值在线程之间有所不同

java - 使用 Lambda 方法简化事件在 Java 中不起作用

java - 如何停止未知数量的动画?

java - 使用切换按钮设置警报通知 - Android

multithreading - 如何限制 kotlin 协程的最大并发性

java - 提高性能一致性的方法

java - 一维java数组的问题

java - 三重 DES Java 不工作

concurrency - 互斥与同步之间的区别?

c - 线程并发C程序