簡體   English   中英

如何同時等待整數達到某個值?

[英]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達到適當的值?

我使用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對象。 適當同步或提交隊列后重新檢查計數。

我會對此發表評論,但沒有代表。

試試這個-Java:如何按需喚醒線程?

您應該能夠監視該值,然后喚醒線程以運行所需的任何函數。

編輯或簡單地等待,然后在值達到正確的數量時通知另一個線程如何在Java中使用wait and notify?

暫無
暫無

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

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