243 votes

Quelle est la différence entre Thread start() et Runnable run() ?

Disons que nous avons ces deux Runnables :

class R1 implements Runnable {
    public void run() { … }
    …
}

class R2 implements Runnable {
    public void run() { … }
    …
}

Alors quelle est la différence entre ceci :

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

Et ceci :

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    t1.start();
    t2.start();
}

330voto

Bhesh Gurung Points 24875

Premier exemple : Pas de threads multiples. Les deux s'exécutent dans un seul thread (existant). Pas de création de threads.

R1 r1 = new R1();
R2 r2 = new R2();

r1 y r2 sont juste deux objets différents de classes qui implémentent la fonction Runnable et donc de mettre en œuvre l'interface run() méthode. Lorsque vous appelez r1.run() vous l'exécutez dans le fil actuel.

Deuxième exemple : Deux fils distincts.

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1 y t2 sont des objets de la classe Thread . Lorsque vous appelez t1.start() il démarre un nouveau fil et appelle la fonction run() méthode de r1 en interne pour l'exécuter dans ce nouveau thread.

7 votes

Puis-je considérer qu'avant d'appeler Thread#start() ,rien de vraiment relatif à os thread ne se passe ? Il s'agit seulement d'un objet java.

4 votes

C'est correct selon la documentation. Vérifiez le code d'initialisation de l'objet thread, qui est conforme à la documentation. Également dans le code source, c'est l'objet start() qui appelle une méthode natvie, qui doit faire en sorte que les choses liées au thread os se produisent.

4 votes

La documentation sur le constructeur de fil est la suivante aquí . La source d'initialisation de l'objet thread est aquí . start() La source de la méthode est aquí .

100voto

Mike Daniels Points 5729

Si vous invoquez simplement run() directement, il est exécuté sur le thread appelant, comme tout autre appel de méthode. Thread.start() est nécessaire pour créer un nouveau fil d'exécution afin que l'interface de l'exécutable run est exécutée en parallèle.

2 votes

Dans la JVM de Hotspot, il existe une correspondance directe entre le thread java et le thread natif. Thread.start() l'invocation fait passer l'état du thread de nouveau l'état de Runnable l'état. Runnable ne signifie pas que le thread est en cours d'exécution. Une fois que le thread natif a été initialisé, le thread natif invoque la fonction run() dans le thread Java, qui fait passer l'état du thread de Runnable a Running . Lorsque le thread se termine, toutes les ressources du thread natif et du thread Java sont libérées.

0 votes

@overexchange Où puis-je trouver le matériel sur le changement d'état.

79voto

EJP Points 113412

La différence est que Thread.start() lance un thread qui appelle le run() tandis que Runnable.run() appelle simplement le run() sur le fil d'exécution actuel.

21voto

aditya Points 147

En fait, Thread.start() crée un nouveau thread et a son propre scénario d'exécution.

Thread.start() appelle le run() de façon asynchrone, ce qui change l'état du nouveau Thread en Runnable.

Mais Thread.run() ne crée pas de nouveau thread. Au lieu de cela, il exécute la méthode run dans le thread en cours d'exécution de manière synchrone.

Si vous utilisez Thread.run() alors vous n'utilisez pas du tout les fonctionnalités du multithreading.

4voto

CHANDRAHAS Points 352

Thread.start() Le code enregistre le Thread auprès de l'ordonnanceur et l'ordonnanceur appelle la fonction run() méthode. Aussi, Thread est une classe tandis que Runnable est une interface.

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