簡體   English   中英

如何在java中以線程安全的方式使迭代器循環

[英]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)是否有另一種,也許更好的方式我可以循環功能。

我建議你不要重新發明輪子,並為此目的使用BlockingQueueThreadPoolExecutor

您可以啟動工作線程(沒有執行程序),並讓它們從有界阻塞隊列中take元素。 在讀取文件時, put塊放入隊列中。 當隊列已滿時,對put的調用將阻塞,直到worker從隊列中獲取一個任務。 如果隊列為空,則工作人員將等待任務進入隊列。 完成處理后,可以interrupt工作線程。

或者,您可以使用帶有限制阻塞隊列CallerRunsPolicyThreadPoolExecutor 這樣,如果隊列未滿,則將提交任務以執行。 如果隊列已滿,則調用者線程將執行該任務(這為工作者提供了處理時間)。 使用此方法,您將擁有最多number_of_threads+queue_capacity塊,但在主線程處理時,某些工作線程可能處於空閑狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM