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

时间:2016-04-16 09:10:10

标签: java multithreading

我正在努力为我的用例

找到正确的Java线程同步机制
  1. 一个不可知数量的线程池在工作流程中进行工作
  2. 工作流程由一些过度的线程重新配置
  3. 在重新配置期间,必须阻止尝试进入工作流程的工作线程。
  4. 有人可以说第3步是如何实现的吗?

    Barring threads to workflow during reconfiguration

2 个答案:

答案 0 :(得分:3)

来自ReentrantReadWriteLock

java.util.concurrent.locks符合您的需求。

  

读写锁允许更高级别的并发性   访问共享数据而不是互斥锁允许的数据。   它利用了这样一个事实,即一次只有一个线程(a   writer线程)可以修改共享数据,在很多情况下可以任意数量   线程可以同时读取数据(因此读取器线程)。

工作线程应该使用ReadLock和“over-seer”线程WriteLock。在重新配置工作流时,写锁会阻止读者。

以下是示例代码

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;
    }
}

答案 1 :(得分:0)

您可以使用Semaphore来保护工作流,该{{3}}使用与池中的线程相同的许可数进行初始化。如果一个线程想要开始处理工作流,它必须获得许可。

正在配置工作流程的主线程" drains"获取所有许可证的信号量。为了使其可靠地工作,您必须创建信号量为“公平”#34;。这会对性能产生影响,但会提供工作线程无法跳转到另一轮处理,即使主线程已经从信号量请求了所有许可。由于主线程现在拥有所有许可,您的工作线程将等待许可变为可用,以便它们可以继续。

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