java - 我如何知道最后一方何时触发 Phaser.arrive()?

标签 java concurrency phaser

给定:

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/

相关文章:

java - Map Stream 获取 Key 和 Value 乘积的总和

java.sql.Timestamp是从java.util.Date创建的,为什么总是before()呢?

java - 在java中对未知维数数组的第一列进行排序

Java - 将 WAV 文件读取为 float 组

concurrency - 如何在 rust 中执行线程安全 IO 和缓存到文件?

java - java中哪里使用屏障模式?

阶段终止后的 java.util.concurrent.Phaser 回调

Java 8 CompletableFuture 、流和超时

javascript - HTML5 Web Worker 是线程还是进程?

java - Phaser 相位值逃逸