2014-11-03 58 views
1

我的應用程序將在運行時包含多個執行獨立工作的線程(在本例中爲7)。但是,每隔一段時間,線程將不得不同步他們的數據。等待多個線程時的最佳實踐 - 時間,數量還是其他?

這將由調用DataSynchronizer對象的線程完成,它們都有一個引用。

我對該類流量的想法是這樣的:

public class DataSynchronizer { 

    public void synchronizeData(List<Data> threadData) { 
     // Wait for all 7 threads to call this method 

     // When all 7 are here, hold them here & do work using one of the threads 
     // or a new anonymous thread 

     // Release the threads & let them continue their independent work 
    } 
} 

我的問題是,什麼是我做同步工作之前,「等待所有的x線」的最佳方式?

我知道所有線程都會在彼此的最大2秒內調用synchronizeData方法。

所以做我,

1)等待2秒第一個線程後調用方法,並承擔所有線程現在也來了嗎?或

2)保持計數以確保所有活動線程都已到達? (如果線程在調用方法之前崩潰,應用程序將等待永恆)

3)Count + timeout?

4)???

+1

你可以使用[CountDownLatch(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)與7 .. – TheLostMind 2014-11-03 10:19:29

+0

可能重複的值[當設置窗體的不透明度,我應該使用一個十進制或雙?](http://stackoverflow.com/questions/4/when-setting-a-forms-opacity-should-i-use-a-decimal-or -double) – Unihedron 2014-11-03 16:43:12

回答

2

這是CyclicBarrier的用途。它允許您定義線程等待所有到達的位置,然後可以選擇運行Runnable來執行同步或其他此類操作。

+0

這裏'CountDownLatch'不會更適合嗎?我的意思是他不需要重設計數。 – TheLostMind 2014-11-03 10:24:02

+0

由於他似乎想多次執行同步,所以'CyclicBarrier'似乎是更明顯的選擇。 – Kayaman 2014-11-03 10:29:43

+0

哦。沒有看到*幾次*部分.. :) – TheLostMind 2014-11-03 10:30:58

2

我想你需要一個java.util.concurrent.CyclicBarrier。

1
  1. 假設和線程是一個非常冒險的方法。
  2. 等待永恆有多糟糕?聽起來對我不方便。
  3. 如果你打到超時時間,你可以做一些有用的事情嗎?崩潰程序,重新啓動錯誤的線程,假設它正在做什麼?

後續問題:

  • 一下如果一個線程不參與同步?
  • 如果同步遲到會發生什麼?
  • 您的方法應該告訴另一個線程,還是隻有7個可互換的工作?