Le super mot-clé de Java et le multithreading

Le super mot-clé de Java et le multithreading - Java - Programmation

Marsh Posté le 16-02-2023 à 14:03:17    

Je suis un nouveau venu dans le monde Java. En faisant des recherches sur le multithreading, je suis tombé sur le programme suivant :

Code :
  1. class Shared
  2. {
  3. int x;
  4. synchronized void show(String s,int a)
  5. {
  6.   x=a;
  7.   System.out.println("Starting in method" +s+  " " +x);
  8.   try
  9.   {
  10.      Thread.sleep(2000);
  11.   }
  12.   catch (Exception e)
  13.   {
  14.    System.out.println("Ending from method" +s+ " " +x); 
  15.   } 
  16. }
  17. }
  18. class CustomThread extends Thread
  19. {
  20.   Shared s;
  21.   public CustomThread(Shared s,String str)
  22. {
  23. super (str);
  24.   this.s=s;
  25.   start();
  26. }
  27. public void run()
  28. {
  29. s.show(Thread.currentThread().getName(),10 );
  30. }
  31. class CustomThread1 extends Thread
  32. {
  33.     Shared s;
  34.     public CustomThread1(Shared s,String str)
  35.   {
  36.      super (str);
  37.   this.s=s;
  38.   start();
  39. }
  40.    public void run()
  41.   {
  42.    s.show(Thread.currentThread().getName(),20);
  43.   }
  44. class RunSyn
  45. {
  46.    public static void main(String...s)
  47.    {
  48.       Shared st=new Shared();
  49.       CustomThread t1=new CustomThread(st,"one" );
  50.       CustomThread1 t2=new CustomThread1(st,"two" );
  51.        }
  52.     }


Dans ce contexte, que fait la ligne super(str) ? Autant que je sache, il invoque le constructeur de la classe Thread Thread (nom de la chaîne). Cela entraîne la création d'un nouvel objet Thread.
Cependant, on peut observer dans la sortie que la chaîne fournie dans le constructeur de CustomThread et CustomThread1 est passée dans l'affichage vide (String s,int a) de Shared class?
J'ai vu cet oracle document qui indiquait que le constructeur de classe de thread qui accepte un paramètre String génère un Thread avec un nom spécifié (plutôt que des noms générés automatiquement comme Thread-1) mais à partir de ici, il indique que l'instruction super (String) est un appel explicite de constructeur de super classe. Les deux déclarations sont déroutantes pour moi. Est-ce que les deux ont raison ? Pourriez-vous s'il vous plaît clarifier ce qui se passe?
Merci!!

Reply

Marsh Posté le 16-02-2023 à 14:03:17   

Reply

Marsh Posté le 17-02-2023 à 19:01:58    

joun17 a écrit :

Autant que je sache, il invoque le constructeur de la classe Thread Thread (nom de la chaîne).

Oui.

joun17 a écrit :

Cela entraîne la création d'un nouvel objet Thread.

Non, créer un objet appelle le constructeur. Mais appeler le constructeur ne crée pas un objet. C'est ici une étape de la construction de CustomThread.

joun17 a écrit :

Cependant, on peut observer dans la sortie que la chaîne fournie dans le constructeur de CustomThread et CustomThread1 est passée dans l'affichage vide (String s,int a) de Shared class?

Je ne comprends pas la question!

joun17 a écrit :

J'ai vu cet oracle document qui indiquait que le constructeur de classe de thread qui accepte un paramètre String génère un Thread avec un nom spécifié (plutôt que des noms générés automatiquement comme Thread-1) mais à partir de ici, il indique que l'instruction super (String) est un appel explicite de constructeur de super classe. Les deux déclarations sont déroutantes pour moi. Est-ce que les deux ont raison ? Pourriez-vous s'il vous plaît clarifier ce qui se passe?
Merci!!

C'est qu'il se passe dans ce code. Pour prendre en compte le nom du thread un appel explicite du constructeur de Thread est nécessaire, c'est le super( str );.

Reply

Marsh Posté le 28-02-2023 à 18:43:22    

Citation :

Dans ce contexte, que fait la ligne super(str) ? Autant que je sache, il invoque le constructeur de la classe Thread Thread (nom de la chaîne). Cela entraîne la création d'un nouvel objet Thread.


Non, l'appel au constructeur entraine la partie de l'initialisation à sa charge.

 

Tu peux y penser comme le mot clé "new" entrainant la création d'un nouvel objet dans un état indéfini. Le constructeur est appelé derrière, pour définir l'état initial de l'objet.

Citation :

Est-ce que les deux ont raison ? Pourriez-vous s'il vous plaît clarifier ce qui se passe?


"super" va appeler le constructeur parent sur le thread existant (le "this" ). Ça va simplement déléguer sans contexte d'exécution, ce qui permet de faire faire ce que le constructeur parent a besoin de faire (comme initialiser le nom du thread, mais aussi allouer les resources OS liées à l'objet par exemple).


Message édité par masklinn le 28-02-2023 à 18:45:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed