ScheduledExecutorService更改延迟反复

时间:2019-04-01 08:16:41

标签: java multithreading executorservice scheduledexecutorservice

我有一个要运行的任务,延迟会不断变化(即-没有固定间隔)。

我想要一个线程并无限循环以查找延迟值,将其输入到执行程序中,然后一旦完成该任务,便找到新的延迟值,等等。

我当前的“基本”实施方式:

long targetTime = findNextTime()/1000;
long currentTime = System.curentTimeMillis()/1000;

delay = targetTime - currentTime;

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);

Runnable task = new Runnable() {

    public void run() {
        System.out.println("Test Task");

        ScheduledFuture<?> future = scheduler.schedule(this, delay, TimeUnit.SECONDS);
    }
}

如何获取新的延迟并继续重复执行此任务?

我应该轮询future并进行递归循环吗?我尝试这样做,但出现错误。

1 个答案:

答案 0 :(得分:0)

有一些答案可以解决。Reinitialize fix delay in ScheduledExecutorServiceHow to change Spring's @Scheduled fixedDelay at runtime

在这里,我支持另一种方法来实现对ExecutorService重复执行此提交任务

class Task implements Runnable {
    private static Random random = new Random();
    private ExecutorService executor;

    public Task(ExecutorService executor) {
        this.executor = executor;
    }

    @Override
    public void run() {
        try {
            System.out.println(System.currentTimeMillis() + "   Hello World");
            TimeUnit.MILLISECONDS.sleep(random.nextInt() % 100);
            executor.execute(this);
        } catch (Exception e) {

        }
    }
}