gpt4 book ai didi

重复非锁定条件信号的 Java 抽象

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:03 26 4
gpt4 key购买 nike

抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在!

我正在寻找一个好的抽象来用于涉及并发线程的情况。

我已经接近了,但还不是很清楚。

稍微简化一下,我在 Android 手机上收集了两种传感器输入 - 方向类型的东西和 WiFi 扫描。

当两者都已收集到足够多时,我想触发一个使用数据的事件。然而,我不想就此打住——这个过程应该继续 N 次。

起初我只是在条件上使用 while 循环,例如

startCollecting();
while (samplesCollected < X){
// wait
while (directionCount < Y || scanCount < Z){};
// then
doSomeStuff();
samplesCollected++;
}
stopCollecting();

但是,SO 告诉我这是一个糟糕的表现,而且我确实遇到了 UI 的一些锁定(即使它在不同的线程上),所以我决定使用 java.util。并发。

问题是我不太清楚应该使用哪种抽象,可能是因为我没有经验。

  • ReentrantLock 的条件:

    条件的想法似乎很棒 - 但我不想控制共享资源 - 我希望数据收集在处理第一批时在后台继续 - 那么我在哪里调用锁定?如果我不锁定,它就会抛出 IllegalMonitorStateException。

  • 倒计时锁:

    看起来很理想——当收集线程有可用数据时,它们可以调用 countDown(),当 countDown 被调用足够多次时,操作可以继续。但是 countDown 应该是一次性执行,我需要重复几次。

  • 循环屏障:

    CountdownLatch 的文档建议如果您希望行为可重复,则应改用 CyclicBarrier - 但 CyclicBarrier 的隐喻对于这种情况似乎完全错误,我不明白如何使用它。

我在下面链接了一些相关问题 - 任何指导将不胜感激。

Efficiency - use of Thread.yield in loop that waits for variable change

How to make a Java thread wait for another thread's output?

is there a 'block until condition becomes true' function in java?

A simple scenario using wait() and notify() in java

最佳答案

我们的代码中有类似的实现。我们创建了一个内部类,它实现了 runnable 并且可以处理数据。我们继续在单个线程中读取数据,一旦数据大小达到特定限制,我们就会将该数据传递给内部类的一个实例,并将该内部类实例作为任务提交给 ThreadPoolExecutor 服务。

这对我们来说效果很好。

关于重复非锁定条件信号的 Java 抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329656/

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