我正在开发一个需要并行和定期检查多个资源的程序:
public class JobRunner {
private final SensorService sensorService;
private ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
public void run() {
sensorService.finalAll().forEach(sensor -> {
Runnable task = () -> {
// read and save new data to log
List<Double> data = sensor.fetchNewData();
this.save(data);
};
// execute every 10 sec
executor.scheduleWithFixedDelay(task, 0, 10, TimeUnit.SECONDS);
});
}
public void save(List<Double> data) {
// ...
}
}
该findAll
调用返回大约 50 个传感器的列表,但是当我运行程序时,我看到虽然在第一个周期查询了所有传感器,但在后续执行中只调用了 2-3 个(例如 - 在 20 秒、30 秒等) . 我在想,由于某些传感器比其他传感器返回得更快,它们会更早地完成任务的等待周期,并被池中的下一个线程抓取,从而使其他完成速度较慢的任务饿死。
如何确保所有任务(传感器)都得到平等对待?这里有哪些最佳实践;我应该使用作业队列还是不同的并发机制?谢谢。