【发布时间】:2018-02-21 21:08:14
【问题描述】:
这就是我想要做的。我在while loop 中记录来自不同传感器的数据,直到用户停止记录。我想每秒记录尽可能多的数据。传感器需要不同的时间来返回一个值,介于 200 毫秒和 3 秒之间。因此,依次调用传感器不是一种选择。
依次调用传感器如下所示:
List<DataRow> dataRows= new ArrayList<DataRow>();
while (recording) {
DataRow dataRow = new DataRow();
dataRow.setDataA(sensorA.readData());
dataRow.setDataB(sensorB.readData());
dataRow.setDataC(sensorC.readData());
dataRows.add(dataRow);
}
根据传感器,读取数据看起来(非常简化)
public class SensorA {
public SensorAData readData(){
sensorA.startSensing();
try {
TimeUnit.MILLISECONDS.sleep(750);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return sensorA.readAndConvertByteStream();
}
}
要利用多线程,SensorA 能否在循环中实现Callable 和接收Future 对象?还是应该将while loop 放在实现接口Runnable 的run() 方法中?
基本上,即使循环已经至少进一步迭代,Java(或线程)是否可以写入正确的dataRow 对象?如果不是,如何解决这个问题?
【问题讨论】:
-
您可以使用
java.util.concurrent包中的线程安全Collection并将其传递给所有传感器线程。传感器线程从ThreadPoolExecutor分配。主线程什么也不做,只是在对象上wait()或重复Thread.sleep(),直到抛出InterruptedException,此时你关闭ThreadPoolExecutor。 -
Re:
Thread.currentThread().interrupt();如果你只是要退出我认为不设置中断位是可以接受的。您只需在代码的其他部分需要检测中断位并因此退出时进行设置。这意味着如果readAndConvertBytes看到中断位,它可能会提前退出。可能不是你想要的。 -
can Java (or a thread) write to the correct dataRow object这在很大程度上取决于您没有向我们展示的细节。读/写循环必须是线程安全的,我们无法判断它们是否是线程安全的。如果对象不与任何其他线程共享,那么它可能没问题(但要注意在底层共享全局状态的对象)。 -
IMO 您需要更加仔细地考虑您的要求。编写一个每秒轮询传感器 A 五次的循环和每三秒轮询传感器 B 一次的不同循环以及在不同线程中运行这些循环很容易。这与最初发明线程的目的非常接近。但是,我无法通过阅读您的问题来判断您想要 做什么 以非常不同的速度传入的这两个数据流。您希望每秒输出多少数据行?您想在哪一行查看哪些数据?
标签: java multithreading loops runnable callable