如何使用信号量在特定点停止和启动所有线程? java

How to stop and start all threads at a certain point with semaphores? java

正在尝试用信号量替换监视器。这个想法是等待线程直到它们都达到这个函数。

这里是监视器:

public void checkThreadsAreToChangeColor() {
        synchronized (lock) {
            while (waitingThreads <= 1) { // Threads are going
                waitingThreads++;
                try {
                    System.out.println(this.id + " sleeping");
                    lock.wait();
                    return;
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
            lock.notifyAll(); // Last thread to change color
            waitingThreads = 0;
            limit = 99999999;
            startTimeOnType = System.currentTimeMillis();;
        }
    }

有关更多详细信息,如果有帮助,总是有 3 个线程。

使用 pveentjer 的代码我设法解决了我的问题。

我建议使用 CyclicBarrier。

因此,对于信号量,您将在计数器达到零后等待。

使用 CyclicBarrier 时,一组线程等待组中的最后一个线程完成。

因此,CyclicBarrier 是更适合您问题的解决方案。

[edit] 我已经更新了我的答案,因为我误解了这个问题。不是一个线程等待一堆线程到达一个公共点,而是一组线程需要等待每个线程到达这个公共点。

[edit2] 我添加了一个基于信号量的 CyclicBarrier 实现。

class CyclicBarrier{
   private final Semaphore mutex = new Semaphore(1);
   private final Semaphore waiters = new Semaphore();
   private final int parties;
   private int completed_parties;
   
   public CyclicBarrier(int parties){
      this.parties = parties;
   }
   
   public void await() throws InterruptedException {
       boolean last_party = false;
       mutex.acquire();
       try{
            completed_parties++;
            if (completed_parties == parties){
               last_party = true;
            }
       }finally{
          mutex.release();
       }

       if(last_party){
           waiters.release(parties);
       }
       waiters.acquire();
   }

}