Остановить поток ScheduledThreadPoolExecutor после возникновения некоторого условия - PullRequest
0 голосов
/ 19 января 2020

Я хочу иметь некоторый пул потоков, который запускает некоторые задачи каждый фиксированный промежуток времени (этот пул потоков постоянно получает задачи). Каждая задача вызывает некоторый API для получения некоторого значения, которое может быть нулевым. Я хочу, чтобы задача запускалась снова (после определенного времени), только если возвращаемое значение равно нулю. В противном случае я не хочу, чтобы эта задача когда-либо выполнялась снова. Есть ли способ добиться этого? Единственное, что я имел в виду, - это использовать ScheduledThreadPoolExecutor и уничтожить указанный поток c изнутри, но я не нашел способа сделать это, и я не уверен, что это хорошая практика.

Спасибо!

1 Ответ

2 голосов
/ 19 января 2020

Вы можете запланировать задачи по одной и проверить свое состояние перед планированием следующей задачи:

public class Solver {

    final long delay = 500L;

    String getSomeValue() {
        if (Math.random() < 0.8) return "not-null";
        return null;
    }

    void init() {
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                long time = System.currentTimeMillis();
                String value = getSomeValue();
                System.out.println("" + value + " " + System.currentTimeMillis());
                if (value == null) {
                    executor.schedule(this, delay - (System.currentTimeMillis() - time), TimeUnit.MILLISECONDS);
                }
            }
        };
        executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
    }

    public static void main(String[] args) {
        new Solver().init();
    }

}
...