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


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

Author: Louis Rhys, 2010-08-16

6 answers

Créer une classe qui implémente l'interface Runnable. Mettez le code que vous souhaitez exécuter dans la méthode run() - c'est la méthode que vous devez écrire pour vous conformer à l'interface Runnable. Dans votre thread "principal", créez une nouvelle classe Thread, en passant au constructeur une instance de votre Runnable, puis appelez start() dessus. start indique à la JVM de faire la magie pour créer un nouveau thread, puis appelez votre méthode run dans ce nouveau thread.

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 oeil à Tutoriel de concurrence de Java pour obtenir commencé.

Si votre méthode doit être appelée fréquemment, cela ne vaut peut-être pas la peine de créer un nouveau thread à chaque fois, car c'est une opération coûteuse. Il serait probablement préférable d'utiliser un pool de threads quelconque. Jetez un oeil à Future, Callable, Executor les classes dans le java.util.concurrent package.

 108
Author: Noel M, 2010-09-01 10:41:50
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();
    }
});
 106
Author: MANN, 2018-09-29 11:29:23

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

Si votre méthode ne prend aucun paramètre, 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();
 44
Author: Aaron Cohn, 2015-07-28 19:53:49

Il y a quelque temps, j'avais écrit une classe utilitaire simple qui utilise le service JDK5 executor et exécute des processus spécifiques en arrière-plan. Depuis doWork() typiquement aurait une valeur de retour void, vous pouvez utiliser cette classe utilitaire pour l'exécuter en arrière-plan.

Voircet article où j'avais documenté cet utilitaire.

 3
Author: raja kolluru, 2010-08-15 23:44:11

Une autre option plus rapide pour appeler des choses (comme les boîtes de dialogue et les boîtes de messagerie et la création de threads séparés pour les méthodes non sécurisées) serait d'utiliser l'expression Lamba

  new Thread(() -> {
                      "code here"
            }).start();
 3
Author: Rohan Sawant, 2017-03-20 14:38:08

Pour y parvenir avec RxJava 2.x vous pouvez utiliser:

Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();

La méthode subscribeOn() spécifie le planificateur sur lequel exécuter l'action - RxJava a plusieurs planificateurs prédéfinis, y compris Schedulers.io() qui a un pool de threads destiné aux opérations d'E/S et Schedulers.computation() qui est destiné aux opérations intensives en CPU.

 1
Author: Clyde, 2017-11-21 22:39:48