java - 在 Java 中使用轮询不好吗?

标签 java multithreading

我有几个 ArrayLists 作为数据队列工作。每个队列都链接到一个单独的 thread,该线程检查该 ArrayList 中是否有一些数据。

 while (array.size == 0) {
    // nothing
 }

 // do stuff with one element of the array
 // remove element from array
 // and call the loop again

我在嵌入式系统编程中做过类似的事情,但是在 Java 中使用它是否安全?问题在于通过非常快速地围绕该 while 循环进行迭代来浪费进程功率。

可以通过添加 Thread.sleep(100) 并每 100 毫秒检查一次来解决,但又一次 - 响应时间变慢。

问题是 - 我需要添加 sleep 还是我不应该担心这个?

关于更安全/更好的系统检查数组中的新数据有什么建议吗?

最佳答案

ArrayList 不是线程安全的集合,因此如果一个线程将数据添加到您的列表中,而另一个线程尝试从同一个列表中检索数据,您无法保证另一个线程会看到添加的元素。

像你描述的那样忙着等待会不必要地消耗cpu资源。

既然您似乎需要一个队列,为什么不使用一个,例如 ArrayBlockingQueue .它有一个 take method这将阻塞,而不消耗 CPU 周期,直到一个项目被添加到队列中。而且它是线程安全的。

关于java - 在 Java 中使用轮询不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159564/

相关文章:

java - 输入文件第一行时Java中的NumberFomatException错误

java - INTELLIJ 终端仅显示目录而不运行命令提示符

java - ZGC 垃圾回收器是否支持字符串去重?

java - 测试多线程计划任务

java - 变量更改时更新 UI

c# - 在 C# 中,如果程序不断输出,如何从执行的 DOS 程序中读取?

java - 使用 Selenium 和 Java 可以通过多少种方式实现拖放功能

multithreading - 如果 nodejs 是多线程的,为什么我应该使用集群模块来利用多核 cpu?

java - 如何让 main 方法等待 GUI 上的输入而不使用 Listener 作为直接触发器?

java - 转换类型 JNI JAVA