Java запланированный исполнитель пула потоков с начальной задержкой на некоторой проверке условия на некотором значении - PullRequest
0 голосов
/ 02 апреля 2019

Проблема:

У меня есть задача, которую нужно запускать периодически с фиксированной задержкой после запуска каждой задачи. Также у меня есть условие где в первоначальной задержке или в первый раз выполнение должно произойти после выполнения условия. Таким образом, исполнитель должен предотвратить планирование задачи, пока условие не будет выполнено.

Пакет Java Concurrent предоставляет нам ScheduledThreadPoolExecutor, у которого есть опция для начальной задержки во времени. Но в моем случае начальная задержка наступает после изменения какого-либо условия или значения на желаемое

Как мне добиться этого поведения и какую службу executor следует использовать или какие методы в службе исполнителя можно переопределить для достижения вышеуказанного поведения.

Я не хочу начинать создание объекта ScheduledThreadPoolExecutor только после того, как условие выполнено, причина в том, что Есть большое количество таких периодических запланированных задач, которые присутствуют в нашем приложении, и если в следующий раз будет добавлена ​​новая задача и если они забудут добавить в часть кода, где выполняется проверка, то это будет запланировано немедленно, без проверки условий. Чтобы избежать этого, я хотел, чтобы служба executor позаботилась обо мне, и в следующий раз любой, кто использует эту службу executor, по умолчанию получит это поведение бесплатно.

Любая помощь приветствуется.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Как насчет того, чтобы создать своего исполнителя заранее, но выполнить операцию планирования задачи на ранее существовавшем исполнителе только после того, как ваше условие выполнено, и вы уже знаете желаемую начальную задержку.

0 голосов
/ 02 апреля 2019

Я не думаю, что вы найдете готовый 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);
}
}
...