3 votes

Que se passe-t-il lorsque vous appelez une méthode dans un thread déjà en cours ?

En exécutant mon code de test ci-dessous, il apparaît que l'appel d'une méthode d'un thread pendant qu'il est encore en cours d'exécution exécute la méthode entre l'exécution actuelle du thread. Ce que je me demande, c'est ce qui se passe exactement.

Le thread met-il en pause la boucle while, exécute-t-il la méthode, puis revient-il à la boucle ? Le fait-il à la fin du code while ou n'importe où entre les deux ?

Ou bien la méthode s'exécute-t-elle dans un autre thread séparé ? Ou quelque chose de tout à fait différent ?

package test;

public class main {
    public static threed thred = new threed();

    public static void main(String[] args) throws InterruptedException {
        thred.start();
        Thread.sleep(10000);
        while (true) {
            System.out.println("doing it");
            thred.other();
            Thread.sleep(2000);
            thred.x++;
        }
    }
}

et

package test;

public class threed extends Thread {
    public int x;

    public threed() {
        x = 0;
    }

    public void run() {
        while (x < 10) {
            System.out.println(x);          
        }   
    }

    public void other() {
        System.out.println("other " + x);
    }
}

11voto

Peter Lawrey Points 229686

Toutes les méthodes appelées utilisent le thread actuel pour tous les objets. Si vous appelez une méthode sur Thread il appelle également cette méthode comme n'importe quelle autre sur le thread en cours.

La seule qui prête un peu à confusion est la suivante start() démarre un autre thread et appelle run() pour ce nouveau fil.

C'est l'une des raisons pour lesquelles il est préférable de ne pas prolonger la durée de vie d'une personne. Thread mais passer un Runnable car trop souvent, les méthodes n'ont pas l'effet escompté ou produisent des effets secondaires inattendus.

REMARQUE : Java dispose souvent d'un objet proxy sur le tas pour gérer une ressource qui est en fait hors du tas (native). Par exemple, ByteBuffer direct ou JTable ou Socket ou FileOutputStream. Ces objets ne sont pas la ressource réelle telle que le système d'exploitation la comprend, mais un objet que Java utilise pour faciliter la gestion/manipulation de la ressource à partir du code Java.

4voto

GhostCat Points 83269

Ce qui se passe : le principal fait tout cela :

thred.start(); // start another thread
Thread.sleep(10000); // sleep
while (true) {
   System.out.println("doing it"); 
   thred.other(); // invoke a method on some object

Signification : le autres exécute son run() méthode, rien d'autre part.

Dans votre code, votre principal invoque simplement une autre méthode sur cet objet thread. Cela se passe toujours sur l'objet principal fil !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X