gpt4 book ai didi

java - 如何同时等待一个整数达到某个值?

转载 作者:行者123 更新时间:2023-12-01 23:10:45 25 4
gpt4 key购买 nike

情况如下:我在大型文本文件上实现 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),它是文件中的字符总数。

现在,让我们想象一下,调用者在 CharSequence 上调用 .charAt(25030);但此时,reader/decoder 类仅(成功)完成了 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 。这个想法是在您的情况下将所需数量的字符绑定(bind)到可以等待的锁存器,例如

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 - 如何同时等待一个整数达到某个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com