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).
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.
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();
}
});
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();
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.
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();
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.