Maison  >  Article  >  Java  >  Comment transmettre des données au thread en Java

Comment transmettre des données au thread en Java

WBOY
WBOYavant
2023-04-30 13:10:061506parcourir

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();              }  }

Puisque cette méthode transmet des 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, il n'y aura donc pas de Les données sont transférées après le le fil est en cours d'exécution. 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. Transmettre des 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 le constructeur lors de la création de l'objet, et l'autre consiste à les transmettre. les données de la classe Définissent une série de méthodes ou de variables publiques (également appelées champs). 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. Transmettre les données via la fonction de rappel

Les deux méthodes de transmission de données aux threads décrites ci-dessus sont les plus courantes. utilisé . 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 processus 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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer