web-dev-qa-db-fra.com

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

104
Louis Rhys

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.

126
Noel M
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();
    }
});
144
MANN

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();
52
Aaron Cohn

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();
7
Rohan Sawant

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.

3
Clyde

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.

3
raja kolluru

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);
1
k13i