使用信号量阻塞线程,直到所有其他线程都运行了一定次数的临界区

NuN*_*uNu 3 java multithreading semaphore

我正在使用信号量编写一个线程进程.

给定K,我希望能够检查所有先前的线程是否已进入临界区至少K-1次.如果不是,则当前线程将阻塞,直到先前的线程能够这样做.

示例:如果设置K = 3,当前线程想要进入临界区时,必须检查所有先前的线程是否已进入临界区K-1(在这种情况下是两次),然后才能进入临界区

有谁知道我可以用Java实现这个方法?提前致谢.

Joh*_*int 7

确保使用的是Java 7并使用Phaser.Phaser完成了开箱即用,K-1将成为相位.

这是一个例子:

int waitForPhase = K-1;
ExecutorService e = Executors.newFixedThreadPool(n);
Phaser phaser = new Phaser(n);
for(int i=0; i< n ;i++){
   e.submit(new Runnable(){
       public void run(){
          for(j =0 ;j < waitForPhase ; j++){ 
              //do work
              phaser.arriveAndAwaitAdvance();
              // if you do not want all sub threads to wait for each
              // this can also be phaser.arrive() 
          }
       }
   });
}
phaser.awaitAdvance(waitForPhase);
Run Code Online (Sandbox Code Playgroud)

因此,在启动时n,相位器中将有注册方.每次一个线程arriveAndAwaitAdvance,它将等待所有线程到达该障碍.一旦所有线程到达该屏障,相位将增加.一旦阶段达到K-1,调用线程就会爆发.

phaser.awaitAdvance(waitForPhase);您的最后声明满意后

当前线程将阻塞,直到前面的线程能够这样做

编辑:

awaitAdvance(int phase)将挂起当前线程,直到Phaser的当前阶段是作为参数传入的阶段.一旦所有线程到达并且递增到当前线程中传递的阶段号将被发信号通知以唤醒.