2011-09-27 3 views
4

을 감안할 때 :마지막 파티가 언제 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)하지만이 경우에 그것을 사용하는 방법을 명확하지 않습니다.

답변

0

나는 이것을 해결하는 매우 우아한 방법을 생각할 수 없지만, 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); 
    } 
0

당신은 별도의 AtomicInteger을 사용하여, 당신은 사전 얼마나 많은 작업을 알 것입니다. 당신이 doSomething를 호출해야하는 경우 휴면 당사자들에게 통지하기 전에, 단지 onAdvance을 무시하고 거기에서 할

int n = 5; 
ExecutorService executor = ... 
final AtomicInteger count = new AtomicInteger (n); 
final Phaser phaser = new Phaser (n); 
for (int i = 0; i < n; ++i) { 
    Runnable task = new Runnable() { 
     public void run() { 
      phaser.arriveAndDeregister(); 
      if (count.decrementAndGet() == 0) { 
       doSomething (this); 
      } 
     } 
    }; 

    // run tasks using a thread-pool (order is not guaranteed) 
    executor.submit (task); 
} 

또는.

final Phaser phaser = new Phaser (n) { 
    protected boolean onAdvance(int phase, int registeredParties) { 
     doSomething(this); 

     return super.onAdvance(phase, registeredParties); 
    } 
}; 
+0

'onAdvance()'가 모든 상대방이 도착한 후에 만 ​​호출되도록 보장되어 있기 때문에 코드에서'if (registeredParties == 0) '를 확인하지 않아도됩니다. 기다리는 파티가 0 개 이상이든 관계없이 이벤트가 시작됩니다. – Gili

+0

옳은 편집 됨. – rxg

관련 문제