J'écris une petite application et maintenant j'ai découvert un problème. J'ai besoin d'appeler une méthode (peut-être plus tard deux) (cette méthode charge quelque chose et renvoie le résultat) sans retard dans la fenêtre de l'application.
J'ai trouvé des classes comme Executor
ou Callable
, mais je ne comprends pas comment travailler avec celles-ci.
Pouvez-vous s'il vous plaît poster une solution qui m'aide?
Merci pour tous les conseils.
Edit: La méthode [~ # ~] doit [~ # ~] retourner le résultat. Ce résultat dépend des paramètres. Quelque chose comme ça:
public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
return webClient.getPage(page);
}
Cette méthode fonctionne environ 8 à 10 secondes. Après avoir exécuté cette méthode, le thread peut être arrêté. Mais je dois appeler les méthodes toutes les 2 minutes.
Edit: J'ai édité du code avec ceci:
public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
Thread thread = new Thread() {
public void run() {
try {
loadedPage = webClient.getPage(page);
} catch (FailingHttpStatusCodeException | IOException e) {
e.printStackTrace();
}
}
};
thread.start();
try {
return loadedPage;
} catch (Exception e) {
return null;
}
}
Avec ce code, je reçois à nouveau une erreur (même si je mets return null
sur catch block).
Tout d'abord, je recommanderais de regarder la Java Thread Documentation .
Avec un Thread, vous pouvez passer un type d'interface appelé Runnable
. La documentation peut être trouvée ici . Une exécutable est un objet qui a une méthode run
. Lorsque vous démarrez un thread, il appelle tout le code de la méthode run
de cet objet exécutable. Par exemple:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Insert some method call here.
}
});
Maintenant, cela signifie que lorsque vous appelez t.start()
, il exécutera le code dont vous avez besoin sans retarder le thread principal. Cela s'appelle un appel de méthode Asynchronous
, ce qui signifie qu'il s'exécute en parallèle avec tout autre thread que vous avez ouvert, comme votre thread main
. :)
Depuis Java 8 vous pouvez utiliser une forme plus courte:
new Thread(() -> {
// Insert some method call here.
}).start();
Mise à jour: Vous pouvez également utiliser la référence de méthode:
class Example {
public static void main(String[] args){
new Thread(Example::someMethod).start();
}
public static void someMethod(){
// Insert some code here
}
}
Vous pouvez l'utiliser lorsque votre liste d'arguments est la même que celle requise @ FunctionalInterface , par ex. Runnable ou Callable .
Mise à jour 2: Je recommande fortement d'utiliser Java.util.concurrent.Executors#newSingleThreadExecutor()
pour exécuter les tâches de tir et d'oubli.
Exemple:
Executors
.newSingleThreadExecutor()
.submit(Example::someMethod);
Voir plus: Platform.runLater
Et Task
dans JavaFX , Références de méthode .
Dans Java 8 si aucun paramètre n'est requis, vous pouvez utiliser:
new Thread(MyClass::doWork).start();
Ou en cas de paramètres:
new Thread(() -> doWork(someParam))