Dans le modèle de développement synchrone traditionnel, lorsque nous appelons une fonction, les données sont transmises via les paramètres de la fonction et le résultat final du calcul est renvoyé via la valeur de retour de la fonction. Cependant, dans le mode de développement asynchrone multithread, la transmission et le retour des données sont très différents du mode de développement synchrone. Étant donné que l'exécution et la fin des threads sont imprévisibles, lors du transfert et du renvoi de données, les données ne peuvent pas être renvoyées via les paramètres de fonction et les instructions de retour comme les fonctions. Cet article présente plusieurs méthodes pour transmettre des données aux threads pour les raisons ci-dessus. Dans le prochain article, nous présenterons les méthodes de renvoi des données à partir des threads.
Si vous voulez le prendre en premier, vous devez d'abord le donner. Généralement, lorsque vous utilisez des threads, vous avez besoin de données d'initialisation, puis le thread utilise ces données pour traiter et renvoyer les résultats. La première chose à faire dans ce processus est de transmettre les données au thread.
1. Transmettre les données via le constructeur
Lors de la création d'un thread, vous devez créer une instance de la classe Thread ou de sa sous-classe. Par conséquent, il n'est pas difficile pour nous de penser à transmettre des données dans le thread via la méthode constructeur de la classe thread avant d'appeler la méthode start. Et enregistrez les données entrantes à l'aide de variables de classe pour une utilisation par le thread (actuellement utilisée dans la méthode run). Le code suivant montre comment transmettre des données via la méthode constructeur :
package mythread; public class MyThread1 extends Thread { private String name; public MyThread1(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { Thread thread = new MyThread1("world"); thread.start(); } }
Étant donné que cette méthode transmet les données lors de la création de l'objet thread, les données sont déjà en place avant l'exécution du thread, de sorte que les données le seront. ne sera pas transféré une fois le thread exécuté. Si vous souhaitez transmettre des données plus complexes, vous pouvez utiliser des structures de données telles que des collections et des classes. Bien qu'il soit plus sûr d'utiliser la méthode constructeur pour transférer des données, cela entraînera de nombreux inconvénients s'il y a beaucoup de données à transférer. Étant donné que Java n'a pas de paramètres par défaut, si vous souhaitez obtenir des effets similaires aux paramètres par défaut, vous devez utiliser la surcharge. Cela rend non seulement le constructeur lui-même trop complexe, mais augmente également considérablement le nombre de constructeurs. Par conséquent, pour éviter cette situation, transmettez les données via des méthodes de classe ou des variables de classe.
2. Transmission de données via des variables et des méthodes
Il existe généralement deux possibilités pour transmettre des données dans un objet, la première consiste à transmettre les données via la méthode constructeur lors de la création de l'objet, et l'autre. L'opportunité est de définir une série de méthodes ou de variables publiques (également appelées champs) dans la classe. Ensuite, après avoir créé l'objet, attribuez les valeurs une par une via les instances d'objet. Le code suivant est une modification de la classe MyThread1, utilisant une méthode setName pour définir la variable de nom :
package mythread; public class MyThread2 implements Runnable { private String name; public void setName(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { MyThread2 myThread = new MyThread2(); myThread.setName("world"); Thread thread = new Thread(myThread); thread.start(); } }
3 Transmission de données via la fonction de rappel
Les deux méthodes de transmission de données au thread. La méthode évoquée ci-dessus est la plus couramment utilisée. Mais les deux méthodes transmettent activement les données à la classe thread dans la méthode principale. Pour les threads, ces données sont reçues passivement. Cependant, dans certaines applications, il est nécessaire d'obtenir des données de manière dynamique pendant l'exécution du thread. Par exemple, trois nombres aléatoires sont générés dans la méthode d'exécution du code suivant, puis la somme de ces trois nombres aléatoires est calculée via la méthode de traitement. de la classe Work, et renvoie le résultat via la valeur de la classe Data. Comme le montre cet exemple, trois nombres aléatoires doivent être obtenus avant de renvoyer la valeur. En d’autres termes, cette valeur ne peut pas être transmise à l’avance à la classe thread.
package mythread; class Data { public int value = 0; } class Work { public void process(Data data, Integer numbers) { for (int n : numbers) { data.value += n; } } } public class MyThread3 extends Thread { private Work work; public MyThread3(Work work) { this.work = work; } public void run() { java.util.Random random = new java.util.Random(); Data data = new Data(); int n1 = random.nextInt(1000); int n2 = random.nextInt(2000); int n3 = random.nextInt(3000); work.process(data, n1, n2, n3); // 使用回调函数 System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value); } public static void main(String[] args) { Thread thread = new MyThread3(new Work()); thread.start(); } }
La méthode de traitement dans le code ci-dessus est appelée fonction de rappel. Essentiellement, les fonctions de rappel sont des fonctions événementielles. Dans l'API Windows, les fonctions de rappel sont souvent utilisées pour interagir avec les données entre le programme appelant l'API. Par conséquent, le processus d’appel de la fonction de rappel est le processus original de déclenchement de l’événement. Dans cet exemple, appeler la méthode process pour obtenir des données équivaut à déclencher un événement dans la méthode run.
Pour une introduction plus détaillée aux trois méthodes de transmission de paramètres Java aux multi-threads, veuillez faire attention au site Web PHP chinois pour les articles connexes !