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

鉴于:

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);
    }

本文翻译自 https://stackoverflow.com/questions/7573699/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java concurrency phaser


相关文章:

java - 缺少来自RelativePath的playframework 2.0 VirtualFile

java - Java不使用所有可用的CPU

c - 互斥锁多次

java - Java中的Thread.interrupt():重点是什么? [重复]

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

java - 从ASCII值转换为Char

java - 正则表达式可接受最多5位数字和小数的数字

java - 如何创建移相器的链/层

java - 以编程方式设置按钮样式

javascript - JavaScript Phaser游戏无法加载?