【问题标题】:Java - Run tasks in varying time intervalsJava - 以不同的时间间隔运行任务
【发布时间】:2020-04-13 21:13:16
【问题描述】:

这个问题是针对大学作业的。
我想每 n*2 秒运行一段代码(例如,等待 1 秒并运行并等待 2 秒并运行并等待 4 秒并运行等)最多 5 次。

我目前有这样的东西。

int timer = 1000;
int tryCounter = 0;

while( !condition()  && counter < 5){
  doTask();
  Thread.sleep(timer);
  timer *= 2;
  counter++;
}

虽然这可行,但我的成绩受益于不使用Thread.sleep()。我发现使用固定费率的ScheduledThreadPoolExecutor 是一种方法,但由于间隔实际上并没有固定,我无法让它工作。

这是一个理论上具有高并发能力的分布式系统,所以重要的是高可扩展性。

如果真的没有任何好处或可行的方法可以通过将其写在我的报告中,我可以使用Thread.sleep()。那么有人对此有任何见解吗?

【问题讨论】:

  • 您可能希望任务的每次运行都以更长的延迟安排下一次运行,而不是调用固定费率。

标签: java executorservice threadpoolexecutor thread-sleep scheduledexecutorservice


【解决方案1】:

可以使用 ScheduledExecutorService 结合一些逻辑来调度任务。 .schedule 参数允许您指定要使用的时间单位。您可以声明一个可以处理您尝试执行的增量的变量。

int timer = 1000;
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    Runnable runnable = new Runnable() {
        public void run()
        {
           //Move your code you want to implement here
        }
    };
    //Increment your variable
    while(!condition()) {
        for(int i = 0; i < 5; i++) {
            service.schedule(runnable, timer, TimeUnit.SECOND);
            timer *= 2;
        }
    }

在可运行块中移动代码执行,然后在计时器递增的 for 循环中调度它应该可以实现您想要的效果。希望有帮助!

【讨论】:

  • 这个设计没有回答!condition()部分问题,每次都启动所有线程。
  • 嗯.... 实现 not 条件非常简单,只需将其嵌入到 while 循环中(如上所述)。目前尚不清楚您的情况是什么,但这与您提供的情况相符。至于不执行每个线程,我不确定您不想执行什么,但是您可以构建多个可运行块甚至多个 ScheduledExecutorServices 来分隔调用调度程序时运行的内容
猜你喜欢
  • 2015-08-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2021-11-07
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多