首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁止工作线程在工作流重新配置时进入

禁止工作线程在工作流重新配置时进入
EN

Stack Overflow用户
提问于 2016-04-16 09:10:10
回答 2查看 77关注 0票数 1

我很难为用例找到正确的Java线程同步机制

  1. 不可知数目的线程在工作流中进行工作的池。
  2. 工作流由某个监控程序线程重新配置。
  3. 在重新配置工作线程期间,必须阻止试图进入工作流的线程。

有人能说出第三步是如何实现的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-16 12:14:36

来自java.util.concurrent.locksjava.util.concurrent.locks将适合您的需要。

读写锁允许在访问共享数据时比互斥锁所允许的并发性更高。它利用了这样一个事实:一次只有一个线程(编写线程)可以修改共享数据,但在许多情况下,任意数量的线程都可以并发读取数据(因此是读取器线程)。

工作线程应该使用ReadLock和“监控程序”线程WriteLock。在重新配置工作流时,写锁会阻塞读取器。

下面是示例代码

代码语言:javascript
复制
import java.util.concurrent.locks.ReentrantReadWriteLock;

class Workflow {

    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

    public void updateWorkflowConfig() {
        this.rwl.writeLock().lock();
        try {
            // do smth
        } finally {
            this.rwl.writeLock().unlock();
        }
    }

    public Work takeWorkFromWorkflow() {
        Work result = null;
        this.rwl.readLock().lock();
        try {
            result = //...
        } finally {
            this.rwl.readLock().unlock();
        }
        return result;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-04-16 10:34:03

您可以使用一个信号量来保护工作流,它使用相同数量的许可初始化,就像池中有线程一样。如果一个线程想要开始处理工作流,它必须获得许可。

配置工作流的主线程通过获取所有许可“耗尽”信号量。要使它可靠地工作,您必须创建信号量才能做到“公平”。这对性能有影响,但将提供工作线程不能跳入另一轮处理,即使主线程已经请求信号量的所有许可。由于主线程现在持有所有许可,因此您的工作线程都将等待许可变为可用,以便它们可以继续使用。

一旦主线程完成,显然它必须释放它所获得的所有许可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36662266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档