Mandar uma mensagem no console a cada 2 segundos

Tenho uma task que roda a cada 1 segundo, quero mandar uma mensagem a cada 10 segundos com precisão, se por acaso a task não rodar em 1 segundo. Esse loop é apenas para testar.

    long timeStart = System.currentTimeMillis();

    long timeEnd = timeStart + (45 * 1000);
    long secondsWarn = (10 * 1000);
    while (true) {

        long currentTime = System.currentTimeMillis();
        if (currentTime == timeEnd) {
            return;
        }
        if (canWarn(timeStart, currentTime, timeEnd, secondsWarn)) {
            //MESSAGE FOR CONSOLE
            System.out.println("Seconds remaing " + timerFormatter(timeEnd - currentTime));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Hugosilvatestes.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

public static boolean canWarn(long timeStart, long currentTime, long timeEnd, long secondsToWarn) {

    long maxWarns = (timeEnd - timeStart) / secondsToWarn;
    long remaingWarns = (timeEnd - currentTime) / secondsToWarn;

    long sentWarns = maxWarns - remaingWarns;

    long prediction = timeStart + (sentWarns * secondsToWarn);

    return (prediction == currentTime) || prediction + (999) == currentTime || prediction - 999 == currentTime;

}

Explique melhor o que você quer, não está claro.

Seu título diz que você quer apresentar uma mensagem a cada 2 segundos.

Sua mensagem diz que você apresenta a cada 1 segundo mas quer apresentar a cada 10 segundos. Se é isso que você quer, então onde você aguarda 1 segundo, é só alterar para aguardar 10 segundos.

1 curtida

Obrigado pela atenção consegui resolver,
Salvei a última vez que foi enviada a mensagem, e checo se já passou os segundos necessários para enviar de novo.

Tem formas mais simples de executar uma atividade com frequência, veja:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Exemplo {

    public static void main(String[] args) {
        Exemplo programa = new Exemplo();
        programa.executar();
    }

    public void executar() {
        Runnable tarefa = () -> executaMinhaTarefa(); // tarefa a ser executada
        int delay = 1; // esperar quanto tempo pra rodar a primeira vez
        int frequencia = 1; // rodar de quanto em quanto tempo
        TimeUnit unidade = TimeUnit.SECONDS; // a unidade de tempo a ser usada

        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(tarefa, delay, frequencia, unidade);
    }

    private void executaMinhaTarefa() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println("Executado ultima vez as " + sdf.format(new Date()));
    }
}

Interessante, muito obrigado !
Pessoas que estão dispostas a tentar ajudar de qualquer forma são sensacionais !