1. Renvoyez des données via des variables et des méthodes de classe
L'utilisation de cette méthode pour renvoyer des données nécessite l'appel de la méthode start avant que les données puissent être obtenues via des variables ou des méthodes de classe. Voyons d'abord quels résultats nous obtenons de l'exemple 2-13.
Copiez le code comme suit :
mythread du paquet ;
la classe publique MyThread étend Thread
{
valeur de chaîne privée1 ;
valeur de chaîne privée2 ;
exécution publique vide()
{
value1 = "Renvoyer les données via les variables membres";
value2 = "Renvoyer les données via la méthode membre";
}
public static void main (String[] args) lève une exception
{
Fil MyThread = new MyThread();
thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
L'exécution du code ci-dessus peut générer les résultats suivants :
Copiez le code comme suit :
valeur1 : nul
valeur2 : nul
Les résultats ci-dessus semblent très anormaux. Des valeurs ont été attribuées à value1 et value2 dans la méthode run, mais null est renvoyé. La raison pour laquelle cela se produit est que les valeurs de value1 et value2 sont affichées immédiatement après l'appel de la méthode start, et la méthode run ici n'a pas encore exécuté les instructions qui attribuent des valeurs à value1 et value2. Pour éviter cette situation, vous devez attendre que la méthode run soit exécutée avant d'exécuter le code qui génère value1 et value2. Par conséquent, nous pouvons penser à utiliser la méthode sleep pour retarder le thread principal. Par exemple, nous pouvons ajouter l'instruction suivante après thread.start() :
dormir (1000);
Cela peut amener le thread principal à retarder l'exécution d'une seconde avant de continuer, mais cela pose un problème, c'est-à-dire comment savoir combien de temps attendre. Dans cet exemple, il n'y a que deux instructions d'affectation dans la méthode run et un seul thread est créé. Par conséquent, un délai de 1 seconde est suffisant, mais si les instructions dans la méthode run sont complexes, ce temps est difficile à prédire. Par conséquent, cette méthode n'est pas stable.
Notre objectif est d'obtenir les valeurs de value1 et value2, il nous suffit donc de déterminer si value1 et value2 sont nulles. Si aucune d’elles n’est nulle, ces deux valeurs peuvent être sorties. Nous pouvons utiliser le code suivant pour atteindre cet objectif :
Copiez le code comme suit :
while (thread.value1 == null || thread.value2 == null);
L'utilisation de l'instruction ci-dessus peut éviter cette situation de manière très stable, mais cette méthode consomme trop de ressources système. Vous pouvez imaginer que si le code de la méthode run est très complexe, l'attribution de valeur1 et valeur2 prendra beaucoup de temps, donc la boucle while doit continuer à être exécutée jusqu'à ce que valeur1 et valeur2 ne soient pas vides. Par conséquent, nous pouvons apporter les améliorations suivantes à la déclaration ci-dessus :
Copiez le code comme suit :
while (thread.value1 == null || thread.value2 == null)
dormir (100);
Dans la boucle while, après avoir jugé pour la première fois les valeurs de value1 et value2, elle dort pendant 100 millisecondes, puis juge ces deux valeurs. Cela occupera moins de ressources système.
Bien que la méthode ci-dessus puisse être très bien résolue, le modèle de thread de Java nous offre une meilleure solution, qui est la méthode de jointure. Comme indiqué précédemment, la fonction de join est d'utiliser des threads pour passer d'une exécution asynchrone à une exécution synchrone. Lorsque le thread est exécuté de manière synchrone, ce n'est pas différent de l'obtention des données de retour d'une méthode ordinaire. Par conséquent, ce problème peut être résolu plus efficacement en utilisant un code comme celui-ci :
Copiez le code comme suit :
thread.start();
thread.join();
Après l'exécution de thread.join(), la méthode run du thread s'est terminée, ce qui signifie que le thread est terminé. Par conséquent, vous pouvez utiliser en toute sécurité n’importe quelle ressource de la classe MyThread après thread.join() pour obtenir les données renvoyées.
2. Renvoyez les données via la fonction de rappel
En fait, cette méthode a été introduite dans « Trois méthodes de transmission des données aux threads ». Dans l'exemple de l'article « Trois méthodes de transmission des données aux threads », les résultats du calcul sont transmis au thread via la méthode de processus de la classe Work, mais en même temps, trois nombres aléatoires sont également obtenus du thread via le méthode de processus. Par conséquent, cette méthode peut à la fois transmettre des données et obtenir des données à partir du thread.