web-dev-qa-db-ja.com

Javaのjavascript setTimeoutと同等のものは何ですか?

ボタンをクリックして60秒後に実行する関数を実装する必要があります。助けてください、私はTimerクラスを使用しましたが、それは最善の方法ではないと思います。

「Timerクラスを使用しましたが、それは最善の方法ではないと思います。」

他の答えは、ユーザーインターフェイス(ボタン)にSwingを使用していないことを前提としています。

Swingを使用している場合は、notを使用します。Swingアプリケーションがフリーズするため、Thread.sleep()を使用します。

代わりに、javax.swing.Timerを使用する必要があります。

詳細と例については、Javaチュートリアル Swing Timerの使用方法 および レッスン:Swingの同時実行性 を参照してください。

19
DavidPostill

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が実行されるまで、呼び出し後にすべてを中断します。

32
Oleg Mikhailov

この目的には、単にThread.sleep()を使用できます。ただし、ユーザーインターフェイスを備えたマルチスレッド環境で作業している場合は、スリープを回避してユーザーインターフェイスをブロックするために、これを別のスレッドで実行することをお勧めします。

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

Java 9 CompletableFuture、すべての単純な使用:

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

使ってはいけません Thread.sleepまたはメインスレッドをフリーズし、JSからのsetTimeoutをシミュレートしません。メインスレッドの実行を停止せずにコードを実行するには、新しいバックグラウンドスレッドを作成して開始する必要があります。このような:

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


        // your code here

    }
}.start();
3
Juliano Moraes
public ScheduledExecutorService = ses;
ses.scheduleAtFixedRate(new Runnable(){
    run(){
            //running after specified time
}
}, 60, TimeUnit.SECONDS);

scheduleAtFixedRateから60秒後に実行 https://docs.Oracle.com/javase/7/docs/api/Java/util/concurrent/ScheduledExecutorService.html

1
babak

Thread.sleep()メソッドを使用する必要があります。

try {

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

}

これは、60,000ミリ秒(60秒)待機してから、コード内の次のステートメントを実行します。

1
Aditya Singh

nderscore-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ミリ秒で開始されます。

1

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

ここ いくつかの情報と例を見つけることができます。

0
Luca Pinelli