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

标签 java multithreading concurrency

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

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

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

稍微简化一下,我在 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/

相关文章:

java - 如何并发素数分解?

java - 为什么JVM需要退出?

java - 如何在 JTextArea 中添加垂直和水平滚动条以查看完整文件 - JAVA

c# - 调用 OnPaint 时 Infragistics UltraGrid 上的 "Index was outside the bounds of the array"

java - 放置和弹出值堆栈的 Struts 2 拦截器是线程安全的吗?

python - 使用类构造函数作为函数创建线程

java - 为什么 CopyOnWriteArrayList 使用额外的内存进行设置、添加操作

java - 我想使用 HttpClient4 对并发发送请求进行 RESTful API 压力测试,我可以使用一个 HttpClient 实例吗?

java - 将两个数组合并为一个

java - 如何从我生成的数据中获取标准差