disons que j'ai une méthode doWork()
. Comment puis-je l'appeler à partir d'un thread séparé (pas le thread principal).
java
multithreading
Louis Rhys
la source
la source
Réponses:
Créez une classe qui implémente l'
Runnable
interface. Mettez le code que vous souhaitez exécuter dans larun()
méthode - c'est la méthode que vous devez écrire pour vous conformer à l'Runnable
interface. Dans votre thread "principal", créez une nouvelleThread
classe, en passant au constructeur une instance de votreRunnable
, puis appelezstart()
-la.start
indique à la JVM de faire la magie pour créer un nouveau thread, puis d'appeler votrerun
méthode dans ce nouveau thread.Jetez un œil au didacticiel sur la concurrence de Java pour commencer.
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 il s'agit d'une opération coûteuse. Il serait probablement préférable d'utiliser une sorte de pool de threads. Jetez un oeil à
Future
,Callable
, lesExecutor
classes dans lejava.util.concurrent
paquet.la source
run()
méthode ne prend aucun paramètre, vous ne pouvez donc pas y passer de variable. Je suggère que vous le passiez dans le constructeur - je modifierai ma réponse pour le montrer.new Thread() { public void run() {myMethod();}}.start();
chemin, est-ce le plus court?Runnable
- la mienne est une classe qui s'étendRunnable
. Et parce que j'ai fait cela, j'ai mon propre constructeur qui transmet l'état à l'objet instancié.ou
ou
ou
ou
la source
run()
?Dans Java 8, vous pouvez le faire avec une seule ligne de code.
Si votre méthode ne prend aucun paramètre, vous pouvez utiliser une référence de méthode:
Sinon, vous pouvez appeler la méthode dans une expression lambda:
la source
->
signifie exactement ?Celery task queue
pour des trucs asynchronesUne autre option plus rapide pour appeler des choses (comme les 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
la source
Il y a quelque temps, j'avais écrit une classe utilitaire simple qui utilise le service exécuteur JDK5 et exécute des processus spécifiques en arrière-plan. Étant donné que doWork () aurait généralement une valeur de retour void, vous souhaiterez peut-être utiliser cette classe d'utilitaire pour l'exécuter en arrière-plan.
Consultez cet article où j'avais documenté cet utilitaire.
la source
Pour y parvenir avec RxJava 2.x, vous pouvez utiliser:
La
subscribeOn()
méthode spécifie sur quel planificateur exécuter l'action - RxJava a plusieurs planificateurs prédéfinis, y compris celuiSchedulers.io()
qui a un pool de threads destiné aux opérations d'E / S et celuiSchedulers.computation()
qui est destiné aux opérations gourmandes en CPU.la source
Si vous utilisez au moins Java 8, vous pouvez utiliser la méthode
runAsync
de la classe CompletableFutureSi vous devez renvoyer un résultat, utilisez à la
supplyAsync
placela source