[英]How to make an iterator cycle round in a thread safe way in java
我正在制作一個分發任務的程序。 我有像這樣的傳播者對象的arraylist:
ArrayList<Workers>
我正在通過一個文件,將其分成固定大小的塊並分發給各種工人。 我正在使用迭代器將塊傳遞給工作者。 通常有比工人更多的塊,所以我需要在我的工人周圍和周圍循環。 我如何做到這一點,我目前的解決方案使用像這樣的迭代器。
private Worker getNextWorker() {
if (workerIterator == null)
workerIterator = workers.iterator();
if (!workerIterator.hasNext())
workerIterator = workers.iterator();
return workerIterator.next();
}
我同步方法以及修改arraylist的方法然而這並不安全,因為另一個線程可以進入並修改迭代器調用之間的集合。 因此,我同步整個文件拆分過程,使其成為一個大的原子語句。
1)我錯過了什么嗎?
2)是否有另一種,也許更好的方式我可以循環功能。
我建議你不要重新發明輪子,並為此目的使用BlockingQueue
和ThreadPoolExecutor
。
您可以啟動工作線程(沒有執行程序),並讓它們從有界阻塞隊列中take
元素。 在讀取文件時, put
塊放入隊列中。 當隊列已滿時,對put
的調用將阻塞,直到worker從隊列中獲取一個任務。 如果隊列為空,則工作人員將等待任務進入隊列。 完成處理后,可以interrupt
工作線程。
或者,您可以使用帶有限制阻塞隊列和CallerRunsPolicy
的ThreadPoolExecutor
。 這樣,如果隊列未滿,則將提交任務以執行。 如果隊列已滿,則調用者線程將執行該任務(這為工作者提供了處理時間)。 使用此方法,您將擁有最多number_of_threads+queue_capacity
塊,但在主線程處理時,某些工作線程可能處於空閑狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.