我有一个接收数据更新的类(如下所示)。我的目的是找出自上次数据更新后5分钟没有收到任何数据更新。
这是我的代码:
public class DataListener {
private final ScheduledThreadPoolExecutor executor;
private ScheduledFuture<Void> future;
public DataUpdateListener() {
executor = new ScheduledThreadPoolExecutor(1);
}
/**
* Start listening for data.
*/
public void start() {
// do some setup...
rescheduleTask();
}
/**
* Called whenever a data event is received.
*/
public void onEvent(final DataEvent event) {
System.out.println("Received event: " + event);
rescheduleTask();
}
private synchronized void rescheduleTask() {
// cancel the existing task
if (future != null) {
future.cancel(true);
executor.purge();
}
// schedule a new one
future = executor.schedule(new Callable<Void>() {
@Override
public Void call() {
System.out.println("No data events received in the last 5 minutes!");
// do some stuff...
shutdown();
return null;
}
}, 5, TimeUnit.MINUTES);
}
void shutdown() {
executor.shutdownNow();
}
}
该课程维护ScheduledThreadPoolExecutor
。每当收到数据更新时,它都会取消现有任务并安排新任务。
我想知道这种方法是否合适,或者是否有更好的方法可以做到这一点。
答案 0 :(得分:1)
您是否考虑过优先级队列实施?如果我没有误解你的问题,那么像PriorityBlockingQueue
这样的东西在这种情况下会很有用。特别是,您可以使用所需的超时值检查poll()
方法。
答案 1 :(得分:0)
在您的方法中,您明确cancel
计划任务,并安排新计划任务。这不是重新安排 ..这实际上是重新创建计划。 IMO,您最好将“即将成为”的时间表存储在列表中......或queue
或stack
。然后在准备好时检索任务。