Quelqu'un peut-il me suggérer comment passer un paramètre à un fil?
En outre, comment cela fonctionne-t-il pour les classes anonymes?
java
multithreading
Steve
la source
la source
Consumer<T>
.Réponses:
Vous devez passer le paramètre dans le constructeur à l'objet Runnable:
et l'invoquer ainsi:
la source
r
aura le même argument, donc si nous voulons passer différents arguments à plusieurs threads en cours d'exécution,MyThread
nous devons créer une nouvelleMyThread
instance en utilisant l'argument souhaité pour chaque thread. En d'autres termes, pour obtenir un thread opérationnel, nous devons créer deux objets: Thread et MyThread. Est-ce considéré comme mauvais sur le plan des performances?Pour les cours anonymes:
En réponse aux modifications apportées aux questions, voici comment cela fonctionne pour les classes anonymes
Classes nommées:
Vous avez une classe qui étend Thread (ou implémente Runnable) et un constructeur avec les paramètres que vous souhaitez transmettre. Ensuite, lorsque vous créez le nouveau thread, vous devez passer les arguments, puis démarrer le thread, quelque chose comme ceci:
Runnable est une bien meilleure solution que Thread BTW. Je préfère donc:
Cette réponse est fondamentalement la même que cette question similaire: Comment passer des paramètres à un objet Thread
la source
parameter
directement à partir de larun()
méthode sans utiliser un champ commep
du tout. Cela semble fonctionner. Y a-t-il quelque chose de multithread subtil qui me manque en ne copiant pasparameter
à l'p
avance?)
dans le premier exemplefinal X parameter
lanew Runnable()
ligne avant , je pouvais accéder à l'parameter
intérieurrun()
. Je n'avais pas besoin de faire le supplémentp = parameter
.final
n'est plus si important; c'est suffisant si la variable est effectivement finale (malgré cela ne fait pas de mal de l'avoir)via le constructeur d'une classe Runnable ou Thread
la source
@Override
pour?@Override
déclare explicitement qu'il remplace la méthode abstraite dans la classe Thread.Cette réponse arrive très tard, mais peut-être que quelqu'un la trouvera utile. Il s'agit de savoir comment passer un ou plusieurs paramètres à une
Runnable
sans même déclarer de classe nommée (pratique pour les inliners):Bien sûr, vous pouvez reporter l'exécution
start
à un moment plus pratique ou approprié. Et c'est à vous de décider quelle sera la signature de lainit
méthode (donc cela peut prendre plus et / ou différents arguments) et bien sûr même son nom, mais en gros vous avez une idée.En fait, il existe également une autre façon de passer un paramètre à une classe anonyme, avec l'utilisation des blocs d'initialisation. Considère ceci:
Tout se passe donc à l'intérieur du bloc d'initialisation.
la source
this.myParam
alors vraiment nécessaire? Ne pourriez-vous pas simplement supprimer les variables privées et vous référer à la variable de la portée externe? Je comprends (bien sûr) que cela a des implications, telles que la variable pouvant être modifiée après le démarrage du thread.Lorsque vous créez un thread, vous avez besoin d'une instance de
Runnable
. Le moyen le plus simple de passer un paramètre serait de le passer en argument au constructeur:Si vous souhaitez ensuite modifier le paramètre pendant l'exécution du thread, vous pouvez simplement ajouter une méthode de définition à votre classe exécutable:
Une fois que vous avez ceci, vous pouvez changer la valeur du paramètre en appelant comme ceci:
Bien sûr, si vous souhaitez déclencher une action lorsque le paramètre est modifié, vous devrez utiliser des verrous, ce qui rend les choses considérablement plus complexes.
la source
Pour créer un thread, vous créez normalement votre propre implémentation de Runnable. Passez les paramètres au thread dans le constructeur de cette classe.
la source
Vous pouvez étendre le ou le et fournir les paramètres que vous souhaitez. Il y a des exemples simples dans les documents . Je vais les porter ici:
Thread
class
Runnable
class
la source
Soit écrivez une classe qui implémente Runnable et passez tout ce dont vous avez besoin dans un constructeur correctement défini, soit écrivez une classe qui étend Thread avec un constructeur correctement défini qui appelle super () avec les paramètres appropriés.
la source
Depuis Java 8, vous pouvez utiliser un lambda pour capturer des paramètres qui sont effectivement définitifs . Par exemple:
la source
Dans Java 8, vous pouvez utiliser des
lambda
expressions avec l' API de concurrence et leExecutorService
comme remplacement de niveau supérieur pour travailler directement avec les threads:Voir aussi
executors
javadocs .la source
Je sais que j'ai quelques années de retard, mais je suis tombé sur ce problème et j'ai adopté une approche peu orthodoxe. Je voulais le faire sans faire de nouveau cours, c'est donc ce que j'ai trouvé:
la source
Paramètre passant par les méthodes start () et run ():
la source
Vous pouvez dériver une classe de Runnable, et pendant la construction (par exemple) passer le paramètre.
Ensuite, lancez-le en utilisant Thread.start (Runnable r);
Si vous voulez dire pendant que le thread est en cours d'exécution, maintenez simplement une référence à votre objet dérivé dans le thread appelant et appelez les méthodes de définition appropriées (synchronisation le cas échéant)
la source
Il existe un moyen simple de passer des paramètres dans des exécutables. Code:
la source
Non, vous ne pouvez pas transmettre de paramètres à la
run()
méthode. La signature vous l'indique (elle n'a pas de paramètres). La façon la plus simple de le faire serait probablement d'utiliser un objet spécialement conçu qui prend un paramètre dans le constructeur et le stocke dans une variable finale:Une fois que vous avez fait cela, vous devez faire attention à l'intégrité des données de l'objet que vous passez dans la «WorkingTask». Les données existeront désormais dans deux threads différents, vous devez donc vous assurer qu'elles sont Thread Safe.
la source
Une autre option; cette approche vous permet d'utiliser l'élément Runnable comme un appel de fonction asynchrone. Si votre tâche n'a pas besoin de renvoyer un résultat, par exemple, elle exécute simplement une action, vous n'avez pas à vous soucier de la façon dont vous transmettez un "résultat".
Ce modèle vous permet de réutiliser un élément, où vous avez besoin d'une sorte d'état interne. Lorsqu'il ne transmet pas de paramètre (s) dans le constructeur, une attention particulière est nécessaire pour assurer l'accès des programmes aux paramètres. Vous devrez peut-être plus de vérifications si votre cas d'utilisation implique différents appelants, etc.
}
Thread t = nouveau Thread (nouveau MyRunnable (paramètre)); t.start ();
Si vous avez besoin d'un résultat de traitement, vous devrez également coordonner l'achèvement de MyRunnable à la fin de la sous-tâche. Vous pouvez renvoyer un appel ou simplement attendre le Thread 't', etc.
la source
Spécialement pour Android
À des fins de rappel, j'implémente généralement mon propre générique
Runnable
avec des paramètres d'entrée:L'utilisation est simple:
En manager:
la source
Créez une variable locale dans votre classe
extends Thread
ouimplements Runnable
.De cette façon, vous pouvez passer une variable lorsque vous l'exécutez.
Le résultat:
la source