Таймер в Java который можно остановить и запустить заново
Помогите создать таймер который через N время вызовет метод , Но в процессе работы его можно будет перезапустить.
Ответы (2 шт):
Автор решения: Agzam4
→ Ссылка
public static void main(String[] args) {
System.out.println("Starting");
go(1000);
// Код не зависимый от таймера
}
private static void go(long time) {
Thread t = new Thread(new Runnable() { // Создаем поток
@Override
public void run() {
waiting(time); // Ждем
printHelloWorld(); // Вызываем функцию
}
});
t.start();
}
private static void waiting(long time) {
try {Thread.sleep(time);} catch (InterruptedException e) {}
}
private static void printHelloWorld() {
System.out.println("Hello world");
}
А если делать игру:
public void run() {
while(running) {
try {
Thread.sleep(wait);
} catch(Exception e) {
e.printStackTrace();
}
updateScreen();
}
}
ПРАВКА
boolean condition = false;
public static void main(String[] args) {
System.out.println("Starting");
go(1000,100);
// Код не зависимый от таймера:
condition = true; // Вызовет метод printHelloWorld() через 1000 миллисекунд
}
private static void go(long time, long time2) {
Thread t = new Thread(new Runnable() { // Создаем поток
@Override
public void run() {
while(true) {
while(condition) { // Когда true - выполнится метод (через time времени)
waiting(time); // Ждем
printHelloWorld(); // Вызываем функцию
condition = false; // то бы не вызвал функцию заново (можно убрать строку, чтобы действие повторялось снова и снова через time миллисекунд)
}
waiting(time2); // Ожидаем, а потом проверяем условие
}
}
});
t.start();
}
private static void waiting(long time) {
try {Thread.sleep(time);} catch (InterruptedException e) {}
}
private static void printHelloWorld() {
System.out.println("Hello world");
}
Автор решения: lampa
→ Ссылка
Используйте предназначенные классы для таймеров
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Hello world!");
// для остановки таймера
this.cancel();
}
}, TimeUnit.SECONDS.toMillis(1000));
Thread.sleep(1000);
// отмена таймера
timer.cancel();
Для перезапуска вынесите в отдельный метод создание таймера, где предыдущий таймер будет отменяться и создаваться новый, например:
private void createTimer(int seconds) {
if(timer != null) {
timer.cancel();
}
timer = new Timer();
//...
}