2017-06-12 1 views
2

Je suis tombé sur un extrait de code en lisant la section ExecutorService du livre Java 8 The complete reference.Java ExecutorService - Création d'un nouveau thread sans le démarrer

L'extrait de code ci-dessous explique comment fonctionne ExecutorService.

// A simple example that uses an Executor. 

import java.util.concurrent.*; 

class SimpExec { 

    public static void main(String args[]) { 
     CountDownLatch cdl = new CountDownLatch(5); 
     CountDownLatch cdl2 = new CountDownLatch(5); 
     CountDownLatch cdl3 = new CountDownLatch(5); 
     CountDownLatch cdl4 = new CountDownLatch(5); 
     ExecutorService es = Executors.newFixedThreadPool(2); 
     System.out.println("Starting"); 
     // Start the threads. 
     es.execute(new MyThread(cdl, "A")); 
     es.execute(new MyThread(cdl2, "B")); 
     es.execute(new MyThread(cdl3, "C")); 
     es.execute(new MyThread(cdl4, "D")); 
     try { 
      cdl.await(); 
      cdl2.await(); 
      cdl3.await(); 
      cdl4.await(); 
     } catch (InterruptedException exc) { 
      System.out.println(exc); 
     } 
     es.shutdown(); 
     System.out.println("Done"); 
    } 
} 

class MyThread implements Runnable { 

    String name; 
    CountDownLatch latch; 

    MyThread(CountDownLatch c, String n) { 
     latch = c; 
     name = n; 
     new Thread(this); 
    } 

    public void run() { 
     for (int i = 0; i < 5; i++) { 
      System.out.println(name + ": " + i); 
      latch.countDown(); 
     } 
    } 
} 

Ce que je ne suis pas en mesure de comprendre est la dernière ligne dans le constructeur de la classe MyThread.

Le constructeur de MyThread crée un objet de Thread en utilisant

nouvelle discussion (ce)

Cependant, ce fil est nouvellement créé n'a jamais commencé en appelant la méthode start(). Aussi, selon ma compréhension ExecutorService crée et gère ses propres threads pour exécuter notre tâche runnable. Alors pourquoi cet objet Thread est-il créé dans ce cas?

+0

(a) la ligne que vous mentionnez est un no- op donc il suffit de l'enlever. (b) Pourquoi appelle-t-on une classe 'RunThread'' MyThread' et non, disons, 'MyRunnable'? – assylias

+0

@assylias (a) Je suis confus alors pourquoi cette ligne fait-elle même partie du code d'exemple. (b) C'est un exemple de code du livre, pas mon code;) – Nullpointer

+0

(a) Seul l'auteur sait (b) Je comprends - Je disais juste que cela me fait douter de la qualité du livre. Mais je n'ai pas lu ce livre donc je ne sais pas. – assylias

Répondre

2

cette ligne:

new Thread(this); 

ne prend aucun effet sur l'exécution du code et vous pouvez enlevé sans problème ...

l'exécuteur va créer son propre thread afin d'exécuter la Code

vous pouvez vérifier que cette ligne de code ne prend pas des effets par:

  1. rem Oving la ligne du code (il obtiendra le même résultat)
  2. donnant un nom au fil et debuggin new Thread(this, "T: " + n); vous verrez qu'aucun fil avec un tel nom apparaît dans la pile
  3. vous pouvez cehck le code source le ThreadPoolExecutor et vérifiez que la méthode private boolean addWorker(Runnable firstTask, boolean core) crée un nouveau travailleur de la runnable que vous avez donné en tant que paramètre et de ce qu'ils font

-

w = new Worker(firstTask); 
final Thread t = w.thread; 
+0

Merci d'avoir clarifié la confusion! – Nullpointer

+0

vous êtes les bienvenus! –