[英]How to wait, concurrently, that an integer reaches a certain value?
情況如下:我在大型文本文件上實現CharSequence
(以便能夠將它們傳遞給Pattern
)。
我有一個CharWindow
列表,這是一個非常簡單的類:
public final class CharWindow
{
private final long fileOffset;
private final long mappingLength;
private final int charOffset;
private final int charLength;
// Constructor, methods, etc etc
}
在一個單獨的類中,我生成CharWindow
的實例, CharWindow
實例從文件的開頭到結尾; 在此過程中,我增加了AtomicInteger
(我們稱其為totalChars
),它是文件中字符的總數。
現在,讓我們想象一下,調用者在CharSequence
上調用.charAt(25030)
; 但是那時,讀取器/解碼器類僅(成功)完成了10430個字符的解碼; 並繼續:15640、21032、25602-每次更新totalChars
。 其他調用者也可以使用不同的參數調用.charAt()
。
讓我們說閱讀器/解碼器類具有(線程安全,並發友好)方法,該方法具有.needChars()
並將int作為參數,並且CharSequence
實現中的.charAt()
代碼如下:
@Override
public char charAt(final int index)
{
readerDecoder.needChars(index);
// do whatever is needed to read the chars
}
有沒有一種方法可以實現.needChars()
以便它阻止等待totalChars
達到適當的值?
我使用PriorityBlockingQueue和CountDownLatches實現了類似的操作。 這個想法是在您的情況下將所需數量的字符綁定到一個閂鎖,可以等待,例如
public class RequireCharacters implements Comparable<RequireCharacters> {
public final long required;
public final CountDownLatch latch = new CountDownLatch(1);
/* ctor etc. */
public int compareTo(RequireCharacters other) { return Long.compare(this.required, other.required); }
}
然后,您可以使用單個PriorityBlockingQueue來管理正在等待更多字符的線程。 如果needChars()
的線程找到了尚未處理的足夠字符,則他將RequireCharacters對象提交到隊列並等待包含的閂鎖。 每當字符數增加時,增加的線程就必須檢查隊列。 隨着排隊元素的排序,它可以窺視並釋放等待線程,直到必須處理更多字符以滿足服務員為止。
線程觀察到字符計數不足的可能性很小,但是在另一個線程增加字符計數之后提交了RequireCharacters對象。 適當同步或提交隊列后重新檢查計數。
我會對此發表評論,但沒有代表。
試試這個-Java:如何按需喚醒線程?
您應該能夠監視該值,然后喚醒線程以運行所需的任何函數。
編輯或簡單地等待,然后在值達到正確的數量時通知另一個線程如何在Java中使用wait and notify?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.