Подтвердить что ты не робот

Что эквивалентно javascript setTimeout в Java?

Мне нужно реализовать функцию для запуска через 60 секунд после нажатия кнопки. Помогите, я использовал класс Timer, но я думаю, что это не лучший способ.

4b9b3361

Ответ 1

"Я использовал класс Timer, но думаю, что это не лучший способ".

Другие ответы предполагают, что вы не используете Swing для своего пользовательского интерфейса (кнопка).

Если вы используете Swing, не используйте Thread.sleep() как это приведет к зависанию вашего приложения Swing.

Вместо этого вы должны использовать javax.swing.Timer.

См. Учебник по Java " Как использовать Swing Timers and Lesson: Concurrency in Swing" для получения дополнительной информации и примеров.

Ответ 2

Асинхронная реализация с JDK 1,8:

public static void setTimeout(Runnable runnable, int delay){
    new Thread(() -> {
        try {
            Thread.sleep(delay);
            runnable.run();
        }
        catch (Exception e){
            System.err.println(e);
        }
    }).start();
}

Для вызова с помощью лямбда-выражения:

setTimeout(() -> System.out.println("test"), 1000);

Или с ссылкой на метод:

setTimeout(anInstance::aMethod, 1000);

Для работы с текущим текущим потоком используйте только синхронную версию:

public static void setTimeoutSync(Runnable runnable, int delay) {
    try {
        Thread.sleep(delay);
        runnable.run();
    }
    catch (Exception e){
        System.err.println(e);
    }
}

Используйте это с осторожностью в основном потоке - он приостановит все после вызова до истечения timeout и runnable.

Ответ 3

Вы можете просто использовать Thread.sleep() для этой цели. Но если вы работаете в многопоточной среде с пользовательским интерфейсом, вы бы хотели выполнить это в отдельном потоке, чтобы избежать спящего режима для блокировки пользовательского интерфейса.

try{
    Thread.sleep(60000);
    // Then do something meaningful...
}catch(InterruptedException e){
    e.printStackTrace();
}

Ответ 4

Используйте Java 9 CompletableFuture, каждый простой:

CompletableFuture.delayedExecutor(5, TimeUnit.SECONDS).execute(() -> {
  // Your code here executes after 5 seconds!
});

Ответ 5

Не используйте Thread.sleep, или он заморозит ваш основной поток, а не имитирует setTimeout из JS. Вам нужно создать и запустить новый фоновый поток для запуска вашего кода, не останавливая выполнение основного потока. Вот так:

new Thread() {
    @Override
    public void run() {
        try {
            this.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        // your code here

    }
}.start();

Ответ 6

Вы должны использовать метод Thread.sleep().

try {

    Thread.sleep(60000);
    callTheFunctionYouWantTo();
} catch(InterruptedException ex) {

}

Это будет ждать 60 000 миллисекунд (60 секунд), а затем выполнить следующие инструкции в вашем коде.

Ответ 7

В библиотеке underscore-java есть метод setTimeout().

Пример кода:

import com.github.underscore.U;
import com.github.underscore.Function;

public class Main {

    public static void main(String[] args) {
        final Integer[] counter = new Integer[] {0};
        Function<Void> incr = new Function<Void>() { public Void apply() {
            counter[0]++; return null; } };
        U.setTimeout(incr, 100);
    }
}

Функция будет запущена через 100 мс с новым потоком.

Ответ 9

Используя java.util.Timer:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        // here goes your code to delay
    }
}, 300L); // 300 is the delay in millis

Здесь вы можете найти информацию и примеры.