2 回答
TA贡献2016条经验 获得超9个赞
你可以用Phaser它。关键是Phaser制片人问“我错过了一些消费吗?” 如果不是,它正在等待,如果是,它会立即继续进行。这是一个例子:
public class Processor {
private final Phaser phaser = new Phaser(1);
private volatile int lastPhaseId = 0;
public void produce() throws InterruptedException{
System.out.println("inside producer method");
lastPhaseId = phaser.awaitAdvance(lastPhaseId);
System.out.println("thread again wakeup");
}
public void consume() throws InterruptedException{
Thread.sleep(1000);
phaser.arrive();
System.out.println("will i ever be ok ");
}
}
这适用于单个消费者的情况。如果假设有多个消费者,则phase.arrive()需要互斥访问和/或注册方相应更改(取决于您需要什么语义)
添加回答
举报