【问题标题】:ScheduledExecutorService change delay repeatedlyScheduledExecutorService 重复更改延迟
【发布时间】:2019-04-01 08:16:41
【问题描述】:

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

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

我当前的“基本”实现:

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 以完成然后执行递归循环吗?我试试这个,我得到一个错误。

【问题讨论】:

  • 将延迟计算移入run() ?

标签: java multithreading executorservice scheduledexecutorservice


【解决方案1】:

有一些答案可以解决这个问题。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) {

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2016-05-09
    相关资源
    最近更新 更多