ボタンをクリックして60秒後に実行する関数を実装する必要があります。助けてください、私はTimerクラスを使用しましたが、それは最善の方法ではないと思います。
「Timerクラスを使用しましたが、それは最善の方法ではないと思います。」
他の答えは、ユーザーインターフェイス(ボタン)にSwingを使用していないことを前提としています。
Swingを使用している場合は、notを使用します。Swingアプリケーションがフリーズするため、Thread.sleep()
を使用します。
代わりに、javax.swing.Timer
を使用する必要があります。
詳細と例については、Javaチュートリアル Swing Timerの使用方法 および レッスン:Swingの同時実行性 を参照してください。
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
が実行されるまで、呼び出し後にすべてを中断します。
この目的には、単にThread.sleep()
を使用できます。ただし、ユーザーインターフェイスを備えたマルチスレッド環境で作業している場合は、スリープを回避してユーザーインターフェイスをブロックするために、これを別のスレッドで実行することをお勧めします。
try{
Thread.sleep(60000);
// Then do something meaningful...
}catch(InterruptedException e){
e.printStackTrace();
}
Java 9 CompletableFuture、すべての単純な使用:
CompletableFuture.delayedExecutor(5, TimeUnit.SECONDS).execute(() -> {
// Your code here executes after 5 seconds!
});
使ってはいけません Thread.sleep
またはメインスレッドをフリーズし、JSからのsetTimeoutをシミュレートしません。メインスレッドの実行を停止せずにコードを実行するには、新しいバックグラウンドスレッドを作成して開始する必要があります。このような:
new Thread() {
@Override
public void run() {
try {
this.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// your code here
}
}.start();
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
Thread.sleep()
メソッドを使用する必要があります。
try {
Thread.sleep(60000);
callTheFunctionYouWantTo();
} catch(InterruptedException ex) {
}
これは、60,000ミリ秒(60秒)待機してから、コード内の次のステートメントを実行します。
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ミリ秒で開始されます。
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
ここ いくつかの情報と例を見つけることができます。