Таймер в 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();
    //...
}
→ Ссылка