使特定线程等待,直到状态计数器达到0

时间:2019-10-14 11:30:58

标签: java multithreading

我正在使用HashMap来跟踪每个状态的计数器,并且试图使某些线程使用相同的状态块调用await(State s),直到该状态的计数器为0。每个线程都使用decrementCounter(State S),然后调用await(State)

我考虑过在锁中添加一个条件,但是我认为这没有任何意义,因为我可以在两个计数器上等待两组不同的线程,并且当一个线程对其中一个计数器使用signalAll()时,它将唤醒这两个组。 任何提示将不胜感激。

注意:计数器在我的代码的另一部分正在递增,但不相关。

在工作线程中:

    private final static Counter counter = new Counter();
    if (condition) {
        counter.decrementCounter(s);
        counter.await(s);
    }

反类:

public class Counter{
    private HashMap<State, Integer> count = new HashMap<State, Integer>();
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private final Lock writeLock = lock.writeLock();
    private final Lock readLock = lock.readLock();

    public void await(State s) throws InterruptedException {
        readLock.lock();
        try {
            //check if state s counter is 0. if it's not 0 block until it is.
        } finally {
            readLock.unlock();
        }
    }

    public void decrementCounter(State s) {
        writeLock.lock();
        try {
            int temp = count.get(s);
            if (temp > 0) {
                count.put(s, temp - 1);
            }
        } finally {
            writeLock.unlock();
        }
    }
}

0 个答案:

没有答案