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

时间:2012-04-23 18:08:33

标签: java multithreading semaphore

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

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

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

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

1 个答案:

答案 0 :(得分: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);

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

phaser.awaitAdvance(waitForPhase);完成您的上一次陈述之后

  

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

编辑:

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