Comment puis-je passer un paramètre à un Fil de Java?
Quelqu'un peut-il suggérer à moi comment je peut passer un paramètre à un fil?
Aussi, comment ça fonctionne pour les classes?
- Auriez-vous l'esprit pour ajouter un peu de supplément d'explication à ce exactement que vous essayez de faire? Il ya beaucoup de différentes techniques pour elle, mais tous dépend de l'objectif final.
- Voulez-vous dire le passage d'un paramètre à un thread en cours d'exécution ? Parce que toutes les réponses sont sur le passage de paramètres à une nouvell...
- J'ai ajouté une modification. Mon erreur.
- Maintenant, vous pouvez utiliser
Consumer<T>
.
Vous devez vous connecter pour publier un commentaire.
Vous devez passer le paramètre dans le constructeur de l'objet Praticable:
et à l'appeler ainsi:
r
aura le même argument, donc si nous voulons passer les différents arguments à plusieurs Threads d'exécutionMyThread
nous avions besoin de créer un nouveauMyThread
instance à l'aide de l'souhaité argument pour chaque Thread. En d'autres termes, pour obtenir un thread en place et fonctionne, nous avons besoin de créer deux objets: Thread et MyThread. Est-ce considéré comme de mauvaises, en terme de performance?Anonyme pour les classes de:
En réponse à la question édite ici est de savoir comment il fonctionne pour les classes
Nommé classes:
Vous avez une classe qui étend la classe Thread (ou implements Runnable) et un constructeur avec paramètres que vous souhaitez passer. Ensuite, lorsque vous créez le nouveau thread, vous devez passer dans les arguments, et puis commencer le fil, quelque chose comme ceci:
Exécutable est une bien meilleure solution que de Fil BTW. Donc je préfère:
Cette réponse est fondamentalement la même que cette question similaire: Comment passer des paramètres à un objet Thread
parameter
directement à partir de larun()
méthode sans l'aide d'un champ commep
à tous. Il semble fonctionner. Est-il un subtil multithreading chose que je suis absent en ne copiant pasparameter
àp
à l'avance?)
dans le premier exemplefinal X parameter
avant lanew Runnable()
ligne, puis j'ai pu accéder àparameter
à l'intérieur derun()
. Je n'ai pas besoin d'avoir besoin de faire de l'extrap = parameter
.final
n'est pas que les plus importants; c'est assez, si la variable est effectivement final (malgré qu'il ne fait pas de mal de l'avoir)via le constructeur de l'Exécutable ou la classe Thread
@Override
pour?@Override
stipule explicitement que c'est la substitution de la méthode abstraite dans la classe Thread.Cette réponse arrive très tard, mais peut-être que quelqu'un va trouver utile. C'est sur la façon de passer un paramètre(s) à un
Runnable
sans même déclarer la classe nommée (très pratique pour inliners):Bien sûr, vous pouvez reporter l'exécution de
start
à certains plus commode ou un moment approprié. Et il est à vous ce sera la signature deinit
méthode (ainsi, il peut prendre plus et/ou des arguments différents) et bien sûr son nom même, mais, fondamentalement, vous obtenez une idée.En fait, il est aussi une autre façon de passer un paramètre à une classe anonyme, avec l'utilisation de l'initialiseur de blocs. Considérez ceci:
Donc tout se passe à l'intérieur de l'initialiseur de bloc.
this.myParam
alors vraiment nécessaire? Ne pourriez-vous supprimer les variables privées et reportez-vous à la variable à partir de l'extérieur de la portée? Je comprends (bien sûr) que cela a certaines conséquences, comme la variable d'être ouvert au changement après le démarrage du thread.Lorsque vous créez un fil, vous avez besoin d'une instance de
Runnable
. La meilleure façon de passer un paramètre serait de la passer en argument du constructeur:Ensuite, si vous souhaitez modifier le paramètre tandis que le thread est en cours d'exécution, vous pouvez simplement ajouter une méthode de définition de votre classe runnable:
Une fois que vous avez cela, vous pouvez modifier la valeur du paramètre en appelant comme ceci:
Bien sûr, si vous voulez déclencher une action lorsque le paramètre est modifié, vous devrez utiliser des verrous, ce qui rend les choses beaucoup plus complexes.
De créer un thread, vous avez l'habitude de créer votre propre implémentation de Runnable. Passer les paramètres au fil dans le constructeur de cette classe.
Vous pouvez étendre la
Thread
class
ou laExécutable
class
et fournir les paramètres comme vous le souhaitez. Il y a des exemples simples dans la docs. Je vais port ici:Soit écrire une classe qui implémente Runnable, et de transmettre ce que vous avez besoin dans un convenablement défini constructeur, ou d'écrire une classe qui étend la classe Thread avec un convenablement défini constructeur qui appelle super() avec les paramètres appropriés.
De Java 8, vous pouvez utiliser une lambda à des paramètres de capture qui sont effectivement final. Par exemple:
Paramètre, en passant par la start() et run() méthodes:
Vous pouvez dériver une classe à partir d'Exécutable, et lors de la construction (dire) passer le paramètre.
Puis de le lancer à l'aide de Fil.start(Runnable r);
Si vous voulez dire tandis que le thread est en cours d'exécution, puis appuyez simplement sur la référence de votre objet dérivé dans le thread appelant, et appeler les méthodes de définition (synchronisation, le cas échéant)
Dans Java 8, vous pouvez utiliser
lambda
expressions avec le La simultanéité de l'API & laExecutorService
comme un niveau plus élevé de remplacement pour travailler avec des fils directement:Voir aussi
executors
la documentation javadoc.Je sais que j'ai quelques années de retard, mais je suis tombé sur cette question et a pris une approche peu orthodoxe. Je voulais le faire sans faire une nouvelle classe, c'est ce que je suis venu avec:
Il existe un moyen simple de passer des paramètres dans runnables.
Code:
Une autre option; cette approche permet d'utiliser l'Exécutable élément comme un asynchrones appel de fonction. Si votre tâche n'a pas besoin de retourner un résultat, par exemple, il effectue simplement une action que vous n'avez pas besoin de vous soucier de comment vous passer de retour à des "résultats".
Ce modèle vous permet de réutiliser un élément, où vous besoin d'une sorte d'état interne. Lorsqu'il n'est pas de passage de paramètre(s) dans le constructeur de soins est nécessaire pour arbitrer les programmes d'accès aux paramètres. Vous avez besoin de plus vérifie si votre cas d'utilisation consiste à différents interlocuteurs, etc.
}
Thread t = new Thread(new MyRunnable(paramètre));
t.start();
Si vous avez besoin d'une suite de traitement, vous aurez aussi besoin de coordonner l'achèvement de MyRunnable lorsque la sous-tâche est terminée. Vous pouvez passer un appel en arrière ou tout simplement attendre sur le Fil "t", etc.
Spécialement pour Android
Pour rappel fins j'ai l'habitude de mettre en place mes propres générique
Runnable
avec un paramètre d'entrée(s):Utilisation est simple:
Dans le gestionnaire:
Non vous ne pouvez pas passer des paramètres à la
run()
méthode. La signature indique que vous (il n'a pas de paramètres). Probablement la meilleure façon de le faire serait d'utiliser un objet qui prend un paramètre dans le constructeur et le stocke dans une variable finale:Une fois que vous faites cela, vous devez être prudent de l'intégrité des données de l'objet que vous passer dans le "WorkingTask'. Les données existent aujourd'hui dans deux threads différents de sorte que vous devez vous assurer qu'il est Thread-Safe.
Créer une variable locale dans votre classe
extends Thread
ouimplements Runnable
.De cette façon, vous pouvez passer une variable lorsque vous l'exécutez.
La sortie: