我正在使用信号量编写一个线程进程。
鉴于K,我希望能够检查所有先前的线程是否已进入临界区至少K-1次。如果没有,则当前线程将阻塞,直到之前的线程能够这样做。
示例:如果设置K = 3,当前线程想要进入临界区时,它必须检查所有先前的线程是否已进入临界区K-1(在这种情况下是两次),然后才能进入关键部分
有谁知道我可以用Java实现这个方法?提前谢谢。
答案 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的当前阶段是作为参数传入的阶段。一旦所有线程到达并且递增到当前线程中传递的阶段号,将发出信号以唤醒。