disons que j'ai une méthode doWork()
. Comment puis-je l'appeler à partir d'un thread séparé (pas le thread principal).
Créez une classe qui implémente l'interface Runnable
. Placez le code que vous voulez 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 transmettant au constructeur une instance de votre Runnable
, puis appelez start()
. start
indique à la machine virtuelle Java 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 commencer.
Si votre méthode doit être appelée fréquemment, il ne vaut peut-être pas la peine de créer un nouveau thread à chaque fois, car cette opération est coûteuse. Il serait probablement préférable d’utiliser un pool de threads. Regardez Future
, Callable
, Executor
classes dans le package Java.util.concurrent
.
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();
}
});
Dans 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();
Une autre option plus rapide pour appeler des choses (telles que DialogBoxes et MessageBoxes et créer des threads distincts pour les méthodes sûres sans thread) consiste à utiliser l'expression Lamba.
new Thread(() -> {
"code here"
}).start();
Pour ce faire, 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, dont Schedulers.io()
qui possède un pool de threads destiné aux opérations d'E/S et Schedulers.computation()
qui est destiné à Opérations gourmandes en ressources CPU.
Il y a quelques temps, j'avais écrit une classe d'utilitaire simple qui utilise le service de l'exécuteur JDK5 et exécute des processus spécifiques en arrière-plan. DoWork () ayant généralement une valeur de retour void, vous pouvez utiliser cette classe d’utilitaire pour l’exécuter en arrière-plan.
Voir cet article où j'ai documenté cet utilitaire.
Si vous utilisez au moins Java 8, vous pouvez utiliser la méthode runAsync
de la classe CompletableFuture
CompletableFuture.runAsync(() -> {...});
Si vous devez renvoyer un résultat, utilisez plutôt supplyAsync
CompletableFuture.supplyAsync(() -> 1);