java - 如果上一个任务未完成,如何不启动 ScheduledExecutorService 任务

标签 java multithreading scheduledexecutorservice

我的问题是我们必须给它一个固定计划时间才能让它启动任务。假设我给出 10 秒,我的任务平均完成时间为 10-15 秒。因此,在一段时间后,quque 中等待线程会导致巨大的内存消耗。如果我使用 syncronized 作为方法,就会出现上述问题。如果我不使用同步,那么我会浪费资源(CPU),因为如果未完成,我不需要运行任务。所以我想到了任务递归调用的解决方案,但我相信递归线程会增加更多内存问题......我应该做什么?很快我只想在任务完成后能够调用它。时间不固定。

public void myScheduledTask{
    doJob(); ( use countdown latch to control waiting if necessary)
    TimeUnit.SECONDS.sleep(x);
    new Thread( new Runnable( { mySchedulTask();   } ));
    or
    executor.execute( a thread that call myScheduledTask() method);
}

最佳答案

听起来像您想要完成的选项:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(count);
ScheduledFuture<?> future = executor.scheduleWithFixedDelay(
                                   task, 
                                   delay, 
                                   delay, 
                                   TimeUnit.MILLISECONDS
                                  );

这将启动您的任务,并在上次完成后延迟毫秒后执行它。 Count 应该是你想要使用的线程数,1 是可以接受的。这还可以让您使用 future 停止任务。

您的示例存在问题。 a) 您正在执行程序线程上 sleep 。不要这样做,让执行者处理它。如果您使用的线程池为 1,则该执行程序在您等待时无法执行任何工作。 b) 启动一个新线程就是从执行器那里获取控制权...只需使用执行器,然后您就可以控制执行。

如果您真的想坚持现有的形式。

class RecurringTask implements Runnable{
    @Override
    public void run(){
        doJob();
        executor.schedule(this, delay, TimeUnit.MILLISECONDS); 
    }
}

现在您将创建从未使用过的 Future,因此控制任务的执行将变得更加困难。

关于java - 如果上一个任务未完成,如何不启动 ScheduledExecutorService 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48335004/

相关文章:

java - Executors 工厂方法 newScheduledThreadPool 始终返回相同的线程池

Java Appium PageFactory initElements 中的 java.lang.IllegalArgumentException @$Proxy21 错误

Java:有没有办法获得压缩字节数组的预期未压缩长度?

java - 如何使用eclipse创建jar文件

java - 在几秒钟内没有响应后,如何停止主线程中通过 TaskExecutor 运行的线程?

java - 如何让flatMap在后台线程执行

java - Netty 和预定执行器服务

java - InstanceOf 关键字在 Java 小程序中不起作用

c# - 从不同线程将数据添加到 DataSet 并同时在 DataGridView 中显示它们

java - ScheduledExecutorService 一段时间后未运行