web-dev-qa-db-fra.com

Un moyen facile d'appeler la méthode dans un nouveau fil

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).

12
Sk1X1

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. :)

26
christopher

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 .

30
Andrii Abramov

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))
6
Rahul Singh