处理从向量中读取数据的竞争线程的最佳方法是什么?
我正在尝试编写一个Android应用程序,我正在尝试定期读取传感器数据并将其写入文件,然后将文件上传到远程服务器。
作为第一步,我为每个传感器注册SensorEventListener然后,每当传感器值发生变化时,我将新值推送到Vector()
。这里data
是用户定义对象的向量。
@Override
// when sensor value is changed, this method will be called.
public void onSensorChanged(SensorEvent event) {
synchronized (this){
Datapoint dp=new Datapoint(event.sensor.getType(),event.values);
data.add(dp);
}
}
下一步,我使用Timer
对象定期从data
向量中读取数据并将其发送到远程服务器。
class calculateSensorData extends TimerTask {
public synchronized void run() {
for (Datapoint item : data) {
//use data
}
data.clear();
}
}
主要问题是当我尝试访问TimerTask
内的数据向量时,我得java.util.ConcurrentModficiationException
。
我认为这是因为传感器侦听器线程和计时器线程都在尝试同时更新/修改共享Vector。
我通过在Timer
任务开始时取消注册侦听器来解决问题。但那不是一个好的解决方案。
每次Timer
触发时,如果没有取消注册并重新注册所有传感器侦听器,任何其他方法都可以实现此目的。