2013-11-28 74 views
1

我有一個Java程序並行執行一些計算。我可以在單臺機器上運行它,也可以使用多臺不同的機器。帶有障礙的進程間同步

在單臺機器上執行時,通過使用java.util.concurrent.CyclicBarrier包中的CyclicBarrier類可以成功實現線程同步。這個想法是所有線程都必須等待其他線程在進行計算之前到達同一個點。

在多個不同的機器上執行時,進程間通信通過RMI(遠程方法調用)實現。我在這種情況下遇到同樣的問題,我希望這些流程的線程在繼續之前等待其他人到達同一點。我不能在不同的進程之間使用共享的CyclicBarrier對象,因爲這個類不是可序列化的。

對於在多臺機器上的不同進程上執行的線程獲取此屏障行爲,我有什麼替代方法?

謝謝

+1

您可以設置此操作看起來不那麼複雜的環境。即,這裏是[Hazelcast的示例實現](https://code.google.com/p/hazelcast/issues/detail?id=435),它使用分佈式的「AtomicNumber」來計算到達的各方。 –

+1

即使它是可序列化的,它仍然不會被共享。對它進行序列化會在目標上創建新副本,而不是共享對象。 – EJP

回答

3

您不需要在進程之間傳遞CyclicBarrier。你可以做一個RMI調用,然後使用一個CyclicBarrier。我建議你看看HazelCast,它支持分佈式Lock和許多其他收藏。

恕我直言,我會重新考慮你是否真的需要所有的流程來檢查點,並找到一種方法,以避免首先需要這一點。

+0

使用CyclicBarrier的RMI調用似乎是個好主意!我還在尋找異步技術來解決這個問題(並避免這個過程同步問題)。 HazelCast似乎也很棒。我不確定我是否能夠使用它,因爲我在第三方羣集上運行此實驗,並且我沒有太多的控制權。感謝您的提示。 –