184 votes

Comment appeler une méthode avec un thread séparé en Java ?

Disons que j'ai une méthode doWork() . Comment l'appeler à partir d'un thread séparé (pas le thread principal).

0 votes

Il y a quelques exemples sur cette récente question connexe : tuer une boucle infinie en java

0 votes

stackoverflow.com/questions/36832094/ J'ai un problème similaire, veuillez m'aider à le résoudre.

0 votes

Vous pouvez également jeter un coup d'œil à Reactive Java. blog.danlew.net/2014/09/15/grokking-rxjava-part-1 pour les tâches asynchrones

276voto

MANN Points 274
Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        // code goes here.
    }
});  
t1.start();

ou

new Thread(new Runnable() {
     @Override
     public void run() {
          // code goes here.
     }
}).start();

ou

new Thread(() -> {
    // code goes here.
}).start();

ou

Executors.newSingleThreadExecutor().execute(new Runnable() {
    @Override
    public void run() {
        myCustomMethod();
    }
});

ou

Executors.newCachedThreadPool().execute(new Runnable() {
    @Override
    public void run() {
        myCustomMethod();
    }
});

1 votes

Cela a parfaitement fonctionné pour ce que je faisais. J'avais besoin d'exécuter un service Web et de mettre à jour une barre de progression simultanément en utilisant le modèle de l'observateur.

0 votes

@Ashish : Veuillez expliquer ce qui a été modifié et pourquoi ?

1 votes

@AshishAggarwal : Ça me semble bizarre que quelqu'un fasse ça sans demander la permission à l'auteur !

161voto

Noel M Points 6263

Créez une classe qui implémente le Runnable interface. Mettez le code que vous voulez exécuter dans le fichier run() c'est la méthode que vous devez écrire pour vous conformer à l'exigence de la Runnable l'interface. Dans votre fil d'exécution "principal", créez un nouveau fichier Thread en passant au constructeur une instance de la classe Runnable puis appeler start() sur elle. start dit à la JVM de faire la magie de créer un nouveau thread, et ensuite d'appeler votre run dans ce nouveau fil.

public class MyRunnable implements Runnable {

    private int var;

    public MyRunnable(int var) {
        this.var = var;
    }

    public void run() {
        // code in the other thread, can reference "var" variable
    }
}

public class MainThreadClass {
    public static void main(String args[]) {
        MyRunnable myRunnable = new MyRunnable(10);
        Thread t = new Thread(myRunnable)
        t.start();
    }    
}

Jetez un coup d'œil à Tutoriel sur la concurrence en Java pour commencer.

Si votre méthode est appelée fréquemment, il n'est peut-être pas utile de créer un nouveau thread à chaque fois, car cette opération est coûteuse. Il serait probablement préférable d'utiliser une sorte de pool de threads. Jetez un coup d'œil à Future , Callable , Executor dans le java.util.concurrent paquet.

1 votes

Que faire s'il y a une variable que vous voulez passer ?

10 votes

El run() ne prend aucun paramètre, vous ne pouvez donc pas y passer une variable. Je vous suggère de la passer dans le constructeur - je modifierai ma réponse pour l'indiquer.

1 votes

Existe-t-il un moyen rapide d'appeler une méthode dans un autre thread ? Je connais le new Thread() { public void run() {myMethod();}}.start(); C'est le plus court ?

78voto

Aaron Cohn Points 821

En Java 8, vous pouvez le faire avec une seule ligne de code.

Si votre méthode ne prend pas de paramètres, vous pouvez utiliser une référence de méthode :

new Thread(MyClass::doWork).start();

Sinon, vous pouvez appeler la méthode dans une expression lambda :

new Thread(() -> doWork(someParam)).start();

19voto

k13i Points 811

Si vous utilisez au moins Java 8, vous pouvez utiliser la méthode runAsync de la classe CompletableFuture

CompletableFuture.runAsync(() -> {...});

Si vous devez retourner un résultat, utilisez supplyAsync au lieu de

CompletableFuture.supplyAsync(() -> 1);

8voto

Rohan Sawant Points 311

Une autre option plus rapide pour appeler des choses (comme DialogBoxes et MessageBoxes et la création de threads séparés pour les méthodes non thread safe) serait d'utiliser l'expression Lamba

  new Thread(() -> {
                      "code here"
            }).start();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X