Wat is het equivalent van javascript setTimeout in Java?

Ik moet een functie implementeren die wordt uitgevoerd na 60 seconden op een knop te hebben geklikt. Help alstublieft, ik heb de Timer-klasse gebruikt, maar ik denk dat dat niet de beste manier is.


Antwoord 1, autoriteit 100%

Asynchrone implementatie met 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();
}

Om te bellen met lambda-expressie:

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

Of met methodeverwijzing:

setTimeout(anInstance::aMethod, 1000);

Gebruik alleen een synchrone versie om de huidige lopende thread aan te pakken:

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

Gebruik dit met de nodige voorzichtigheid in de hoofdthread – het schort alles op na de aanroep totdat timeoutverloopt en runnablewordt uitgevoerd.


Antwoord 2, autoriteit 50%

Gebruik Java 9 CompletableFuture, heel eenvoudig:

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

Antwoord 3, autoriteit 41%

“Ik heb de Timer-klasse gebruikt, maar ik denk dat dat niet de beste manier is.”

De andere antwoorden gaan ervan uit dat je Swing niet gebruikt voor je gebruikersinterface (knop).

Als je Swing gebruikt, gebruik dan geenThread.sleep()omdat het je Swing-applicatie zal bevriezen.

In plaats daarvan moet je een javax.swing.Timergebruiken.

Bekijk de Java-tutorial Swing Timers gebruikenen Les: Gelijktijdigheid in Swingvoor meer informatie en voorbeelden.


Antwoord 4, autoriteit 19%

De 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

Hierkun je wat info en voorbeelden vinden.


Antwoord 5, autoriteit 11%

U kunt hiervoor eenvoudig Thread.sleep()gebruiken. Maar als u in een multithreaded-omgeving met een gebruikersinterface werkt, wilt u dit in de afzonderlijke thread doen om te voorkomen dat de gebruikersinterface wordt geblokkeerd door slaapstand.

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

Antwoord 6, autoriteit 11%

Gebruik Thread.sleepniet, anders zal je hoofdthread bevriezen en setTimeout van JS niet simuleren. U moet een nieuwe achtergrondthread maken en starten om uw code uit te voeren zonder de uitvoering van de hoofdthread te stoppen. Zoals dit:

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

Antwoord 7, autoriteit 6%

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

het wordt uitgevoerd na 60 seconden vanaf scheduleAtFixedRate
https://docs.oracle.com/ javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html


Antwoord 8, autoriteit 2%

U moet de methode Thread.sleep()gebruiken.

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

Dit wacht 60.000 milliseconden (60 seconden) en voert dan de volgende instructies in uw code uit.


Antwoord 9, autoriteit 2%

Er is een setTimeout()-methode in underscore-javabibliotheek.

Codevoorbeeld:

import com.github.underscore.Underscore;
import java.util.function.Supplier;
public class Main {
    public static void main(String[] args) {
        final Integer[] counter = new Integer[] {0};
        Supplier<Void> incr =
            () -> {
                counter[0]++;
                return null;
            };
        Underscore.setTimeout(incr, 0);
    }
}

De functie wordt over 100 ms gestart met een nieuwe thread.

Other episodes