抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在!
我正在寻找一个好的抽象来用于涉及并发线程的情况。
我已经接近了,但还不是很清楚。
稍微简化一下,我在 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?
最佳答案
我们的代码中有类似的实现。 我们创建了一个内部类,它实现了 runnable 并且可以处理数据。 我们继续在单个线程中读取数据,一旦数据大小达到特定限制,我们就会将该数据传递给内部类的一个实例,并将该内部类实例作为任务提交给 ThreadPoolExecutor 服务。
这对我们来说效果很好。
关于重复非锁定条件信号的 Java 抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329656/