自上次数据事件以来经过的时间

时间:2012-10-08 09:55:35

标签: java multithreading executorservice future

我有一个接收数据更新的类(如下所示)。我的目的是找出自上次数据更新后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。每当收到数据更新时,它都会取消现有任务并安排新任务。

我想知道这种方法是否合适,或者是否有更好的方法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

您是否考虑过优先级队列实施?如果我没有误解你的问题,那么像PriorityBlockingQueue这样的东西在这种情况下会很有用。特别是,您可以使用所需的超时值检查poll()方法。

答案 1 :(得分:0)

在您的方法中,您明确cancel计划任务,并安排新计划任务。这不是重新安排 ..这实际上是重新创建计划。 IMO,您最好将“即将成为”的时间表存储在列表中......或queuestack。然后在准备好时检索任务。