Java 使特定线程等待状态';s计数器达到0

Java 使特定线程等待状态';s计数器达到0,java,multithreading,Java,Multithreading,我使用HashMap来跟踪每个状态的计数器,并试图让某些调用相同状态块的线程等待(状态),直到状态计数器为0。每个线程使用递减计数器(状态S),然后调用wait(状态S) 我曾考虑过向锁中添加一个条件,但我认为这没有意义,因为我可能有两组不同的线程在两个计数器上等待,当一个线程对其中一个计数器使用signalAll()时,它会唤醒两组线程。 如有任何提示,将不胜感激 注意:计数器在代码的另一部分中递增,但不相关 在工作线程中: private final static Counter c

我使用HashMap来跟踪每个状态的计数器,并试图让某些调用相同状态块的线程等待(状态),直到状态计数器为0。每个线程使用递减计数器(状态S),然后调用wait(状态S)

我曾考虑过向锁中添加一个条件,但我认为这没有意义,因为我可能有两组不同的线程在两个计数器上等待,当一个线程对其中一个计数器使用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();
        }
    }
}
公共类计数器{
私有HashMap计数=新HashMap();
私有最终ReentrantReadWriteLock锁=新的ReentrantReadWriteLock();
private final Lock writeLock=Lock.writeLock();
私有最终锁readLock=Lock.readLock();
public void wait(状态s)抛出InterruptedException{
readLock.lock();
试一试{
//检查状态的计数器是否为0。如果它不是0,则阻塞直到它为。
}最后{
readLock.unlock();
}
}
公共无效递减计数器(状态s){
writeLock.lock();
试一试{
int temp=计数获取;
如果(温度>0){
计数放置(s,温度-1);
}
}最后{
writeLock.unlock();
}
}
}

您这样做是作为并行编程的练习吗?在标准库中已经有一个现成的类用于您所描述的内容。是的,我是!谢谢,我来看看。