2012-02-01 32 views
1

我有一堆對象。他們不需要排序或訂購。他們有一個需要調用的方法:myObject.update()。最終他們將需要從他的容器中移除。線程數據集?

現在它是單線程的,update()方法是CPU綁定的(沒有I/O)。我們有一個很好的16個「核心」(核心+ HT)的服務器。

我想要做的是有一個容器對象負責「dishing out」對象。然後有15個線程在需要時詢問容器中的新對象。這是一個好方法嗎?

什麼是保持對象的線程安全數據結構?還是應該讓容器對象負責不發送同一個對象兩次?

+1

我認爲我們需要更多的上下文來理解你想要達到的目標。對象是通過自己的更新方法還是由其他方法刪除的?什麼是一大堆?你是否只更新一次或者某種「遊戲循環」? – 2012-02-01 18:11:20

+0

[ConcurrentLinkedQueue](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html)? – 2012-02-01 18:25:38

回答

1

在java中,您的問題的最佳人選爲LinkedBlockingQueueArrayBlockingQueue

它們提供了先進先出功能,並且一次只保存一個元素的可選邊界。

或者,一個好方法是使用ExecutorService,它包含一個線程池和一個內部隊列,用於按需提供線程。

+0

+1只需在MyObject中實現Runnable,並在其池中設置一個包含16個線程的ExecutorService(您需要嘗試查找哪些數字可以提供最佳性能),然後爲其提供* MyObject的BlockingQueue。 – 2012-02-01 18:17:02