gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:31:34 24 4
gpt4 key购买 nike

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

给定 K,我希望能够检查是否所有之前的线程都至少进入过临界区 K-1 次。否则,当前线程将阻塞,直到先前的线程能够执行此操作为止。

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

有谁知道我可以用 Java 实现它的方法吗?提前致谢。

最佳答案

确保您使用的是 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); 之后你的最后一个语句得到满足

current thread would block until the previous threads have been able to do so

编辑:

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

关于java - 使用信号量阻塞线程,直到所有其他线程都运行临界区一定次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com