планировщик задач

231
04 декабря 2018, 14:20

собственно задача: нужно один раз в указанное время (исходя из текущей времени рассчитывается) выполнять метод.

Calendar cur = Calendar.getInstance();
SimpleDateFormat sdfH = new SimpleDateFormat("HH");
SimpleDateFormat sdfM = new SimpleDateFormat("mm");
int h = Integer.parseInt(sdfH.format(cur.getTime()));
int m = Integer.parseInt(sdfM.format(cur.getTime()));
if (m % 15.0 == 0) {
    cur.set(Calendar.HOUR_OF_DAY, h);
    cur.set(Calendar.MINUTE, m);
}
if (m / 15.0 < 1) {
    cur.set(Calendar.HOUR_OF_DAY, h);
    cur.set(Calendar.MINUTE, 15);
    cur.set(Calendar.SECOND, 0);
}
if (m / 15.0 > 1 && m / 15.0 < 2) {
    cur.set(Calendar.HOUR_OF_DAY, h);
    cur.set(Calendar.MINUTE, 30);
    cur.set(Calendar.SECOND, 0);
}
if (m / 15.0 > 2 && m / 15.0 < 3) {
    cur.set(Calendar.HOUR_OF_DAY, h);
    cur.set(Calendar.MINUTE, 45);
    cur.set(Calendar.SECOND, 0);
}
if (m / 15.0 > 3) {
    cur.set(Calendar.HOUR_OF_DAY, h + 1);
    cur.set(Calendar.MINUTE, 0);
    cur.set(Calendar.SECOND, 0);
}
Date startTime = cur.getTime();
Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
        gt();
    }
}, startTime);

так писать нормально, или есть другие оптимальные варианты?

Answer 1

Ответ с enSO:

Timer timer = new Timer();
  timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    //Ваш код здесь, например лямбда
  }
}, 2*60*1000, 2*60*1000);

Из ответа на ruSO:

1) Swing Timer

import javax.swing.Timer; //Будет вызываться каждую секунду
timer = new Timer(1000, new ActionListener(
    public void actionPerformed(ActionEvent ev) {
         //Ваш код здесь, напр. метод
    }));
timer.start();

2) Таймер с пом. цикла:

public class Test {
public static void main(String args[]) {
    new Thread(new Runnable() {
        public void run() {
            while(true) { //бесконечно крутим
                try {
                    Thread.sleep(4000); //4 секунды
                    //Ваш код здесь
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
}

3) Или вот еще с пом. Timer:

    import java.util.*;
public class Test {
    public static void main(String args[]) {
        Timer timer = new Timer();
        timer.schedule(new SayHello(), 0, 4000); // ставим по расписанию выполнять SayHello каждые 4 секунды
    }
}
class SayHello extends TimerTask {
    public void run() {
       //Ваш код здесь 
    }
}
Answer 2

Запускать в указанное время можно использовать ScheduledExecutorService

private final ScheduledExecutorService scheduler =
 Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> {
   gt();
 }, startTime.getTime() - new Date().getTime(), MILLISECONDS);
READ ALSO
Как сделать след от нажатия на кнопку?

Как сделать след от нажатия на кнопку?

Не пойму как сделать вот такой след у кнопки, который заполняется при нажатии на негоМожет кто знает как?

252
Не создается наследник Application в jax-rs на wildfly 13

Не создается наследник Application в jax-rs на wildfly 13

Пытаюсь запустить REST сервис на jax-rs

202
Проблемы с адаптером из библтотеки DragListView для Android

Проблемы с адаптером из библтотеки DragListView для Android

Я новичок в Android, пытаюсь использовать библиотек DragListView и не пойму как поставить адаптер? лазил внутри библиотеки, так ничего и не нашел

214
Шаблон отрисовки координат

Шаблон отрисовки координат

Помогите битый час не могу найти шаблон отрисовки данных координат кругового рассеивания путём загрузки из тхт файла формата: 1 47520988 8033534

227