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 - 如何使此junit测试Java内存泄漏通过?

java - 具有数组的JAVA员工类型

javascript - 相位器3:为什么没有图像显示?

java - 移相器类和分层

java - 在Java中使用正则表达式验证文件名

java - Java STM:有关Multiverse STM的问题

ruby - 如何阻止主线程退出?

java - Java ThreadPool重用可运行对象,而不是为每个任务创建新对象

java - Java:jsr166y Phaser的教程/说明

java - 简单的递归功能将值保存到列表