给定:
Executor executor = ...;
Phaser phaser = new Phaser(n);
for (int i=0; i<n; ++i)
{
Runnable task = new Runnable()
{
public void run()
{
phaser.arriveAndDeregister();
if (lastTask)
doSomething(this);
}
}
// run tasks using a thread-pool (order is not guaranteed)
executor.submit(task);
}
我想知道我是否是最后一个任务,以便根据任务的内部状态触发 doSomething()
。我找到了 Phaser.onAdvance(int, int)但不清楚如何在这种情况下使用它。
最佳答案
我想不出一个非常优雅的方法来解决这个问题,但使用 ThreadLocal 和 onAdvance 会有所帮助。
final ThreadLocal<Boolean> isLast = new ThreadLocal<Boolean>() {
public Boolean initialValue() {
return false;
}
};
final Phaser p = new Phaser(9) {
public boolean onAdvance(int phase, int registeredParties) {
isLast.set(true);
return true;
}
};
然后
public void run()
{
phaser.arriveAndDeregister();
if (isLast.get())
doSomething(this);
}
关于java - 我如何知道最后一方何时触发 Phaser.arrive()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573699/