собственно задача: нужно один раз в указанное время (исходя из текущей времени рассчитывается) выполнять метод.
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);
так писать нормально, или есть другие оптимальные варианты?
Ответ с 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() {
//Ваш код здесь
}
}
Запускать в указанное время можно использовать
ScheduledExecutorService
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> {
gt();
}, startTime.getTime() - new Date().getTime(), MILLISECONDS);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей