2013-10-24 68 views
2

我實現了MyListener這是從兩個不同的線程訪問。如何正確使用Phaser?

class MyListener implements Listener { 
    private final Phaser phaser = new Phaser(2);   

    @Override 
    public void changed() { 
     phaser.arrive(); 
    } 

    public void await() { 
     phaser.arriveAndAwaitAdvance();  
    } 
} 

我使用它像這樣在主線程

MyListener listener = new Listener(); 
someObject.setListener(listener);  

doSomething(); //it would result in Listener.changed() being invoked 
listener.await(); 

doSomething(); //it would result in Listener.changed() being invoked 
listener.await(); 

我有幾個擔心:

  1. Java文檔指出調用arrive()arriveAndAwaitAdvance()無需調用register()第一是不正確的。
  2. changed()可能會多次調用相同的事件。我預計await()之一可能會因前一事件而立即迴歸。

關於這個問題的任何想法?

+0

你想實現什麼?每個'doSomething()'後的 – Holger

+0

,'listener.await()'只有在其他線程調用changed時纔會返回。 –

回答

1

關於你的第一個擔憂:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html#arrive()

說:

這是一個未登記者調用此方法的用法錯誤。

它沒有聲明登記必須通過調用register()進行。您在構造函數中指定預先註冊的參與方的數量是有效的用法。


關於第二個,你不得呼叫arrive多次。目前還不清楚你對一個事件調用changed()幾次的意圖是否意味着是允許在第一次調用時進行的另一個線程,最後一個線程(如何知道它是最後一個?)還是其中的一個?

您似乎想要分割到達,即讓其他進程有權繼續等待此權限。這很容易:不要使用化合物arriveAndAwaitAdvance()

int currentPhase = phaser.arrive(); // allow the other thread to proceed 
… 
phaser.awaitAdvance(currentPhase); // wait for the other thread’s arrival 
+0

這一行實際意味着什麼或試圖表示什麼? 「這是未註冊方調用此方法的使用錯誤。」 –

+0

正是它所說的錫 – Holger

+0

對不起,我沒有得到你。 「未登記方」是什麼意思? –