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;
}
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.
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()));
}
}