Java调度的线程池执行程序,在某些条件下对某些值进行初始延迟检查

时间:2019-04-02 05:49:16

标签: java multithreading scheduled-tasks scheduler

问题:

我有一个任务,必须在每个任务运行之后以固定的延迟定期运行。我也有条件 在满足条件后应该在最初的延迟或首次执行的地方。所以执行者必须 在满足条件之前,不要安排任务。

Java并发包为我们提供了ScheduledThreadPoolExecutor,它具有用于初始时间延迟的选项。但就我而言 初始延迟是在某些条件或值更改为所需条件之后。

我如何实现此行为以及应使用哪种executorservice或可以重写exe​​cutor服务中的哪些方法以实现上述行为。

我不想仅在条件满足后才开始创建ScheduledThreadPoolExecutor对象,原因是 我们的应用程序中存在大量此类定期计划任务,如果下次添加任何新任务, 如果他们忘记在进行检查的代码部分中添加代码,则将立即安排它,而无需进行任何条件检查。 为了避免它,我想要一个执行者服务来为我处理它,下次使用此executorservice的任何人默认情况下都会获得此服务 免费行为。

感谢您的帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

我认为您不会找到现成的ExecutorService来处理您的用例。因此,为什么不这样尝试,请创建扩展ScheduledThreadPoolExecutor的自定义类,并在其中覆盖beforeExecute方法,然后在此处编写代码以检查首次执行(具有自定义标志以检查是否是第一次执行),比其他调用它将执行正常的可运行对象。类似于以下代码:

import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestClass extends ScheduledThreadPoolExecutor {

public TestClass(int corePoolSize) {
    super(corePoolSize);
}

@Override
protected void beforeExecute(Thread t, Runnable r) {
    super.beforeExecute(t, r);
}

@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
    return super.schedule(command, initialDelay, TimeUnit.MILLISECONDS);
}
}

答案 1 :(得分:0)

您如何提前创建执行程序,但是仅在满足条件并且已经知道所需的初始延迟之后,才对预先存在的执行程序执行计划任务的操作。