我想了解启动可运行线程的两种不同方法的性能和CPU / RAM要求。
我有一些代码,每10毫秒收集传感器数据,并将值插入到后台线程中的数据库中(使用单个线程执行器)。 Executor服务的创建方式如下:
executor = Executors.newSingleThreadExecutor();
其中一种方法是像这样做...
public void onSensorChanged(SensorEvent event) {
//get sensor values
//insert into database
executor.execute(new Runnable(){
//database insert code here
});
}
我在很多教程中看到了这种方法,但由于我每10ms就要执行一次,感觉它会占用很多资源,因为每当检测到传感器值变化时,我就会创建一个新对象。这个新对象每10ms是否会被覆盖?或者随着新对象的创建,它是否会占用越来越多的RAM?
后来我重构了我的代码,使其更像这样:
executor = Executors.newSingleThreadExecutor();
myRunnable = new MyRunnable();
class MyRunnable implements Runnable {
public void run() {
//database insert code here
}
}
public void onSensorChanged(SensorEvent event) {
//get sensor values
//insert into database
executor.execute(myRunnable);
}
我认为只需实例化一个对象一次,而不是每次传感器变化时都这样做。我的想法正确吗?相比之前的方法,这种方式使用的RAM更少吗?有没有更高效/更好的方法来完成这个任务?
executor.execute()
是将任务添加到队列中,每个排队的任务都在执行保存操作? - SimononSensorChanged
期间,我将传感器值收集为一个数组,并替换该初始浮点数数组。因此,该数组每10毫秒就会被最新值覆盖。然后,MyRunnable
类只需获取该数组的值并插入数据库。 - Simon