2014-02-26 19 views
0

情況如下:我在大文本文件上執行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小號實例;在這個過程中,我增加了一個AtomicInteger(讓我們把它稱爲totalChars),這是文件中的字符總數。

現在,讓我們想象一下,來電者撥打電話.charAt(25030)CharSequence;但是此時,讀取器/解碼器類僅完成(成功)解碼10430個字符;並繼續:15640,21032,25602 - 每次更新totalChars。其他呼叫者也可以用不同的參數呼叫.charAt()

讓我們說,讀/解碼器類有一個(線程安全的,同時友好的)方法具有.needChars()有一個int作爲參數和.charAt()CharSequence實現的代碼如下:

@Override 
public char charAt(final int index) 
{ 
    readerDecoder.needChars(index); 
    // do whatever is needed to read the chars 
} 

有沒有一種方法實現.needChars(),以便它阻止等待totalChars達到適當的值?

回答

3

我使用PriorityBlockingQueueCountDownLatches實施類似的東西。這個想法是將你需要的字符數綁定到一個可以等待的鎖存器上。

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對象的機會很小。要麼正確同步,要麼在提交隊列後重新檢查計數。

+0

非常有趣!我會在那... – fge

+0

我忘了添加它,但我認爲等待時間必須是重要的,以證明這種同步的開銷。如果平均等待時間相當短,只需簡單地等待AtomicLong(可能會添加一些線程)即可。產率()秒)。 – Pyranja

+0

那麼,它取決於最初的文件大小......如果它有幾百兆字節的長度,則可能需要一些時間來驗證所有文本/計算偏移等。另外,如果不需要等待,那麼我會盡快修改,當然,對於所有來電者來說最終都是如此。 – fge