2013-12-10 18 views
13

Ich habe eine neue Frage. Ich habe diesen Code:Thread.join() entspricht in Executor

public class Main 
{ 

    public static void main(String[] args) throws InterruptedException 
    { 
     // TODO Auto-generated method stub 
     IntHolder aHolder=new IntHolder(); 
     aHolder.Number=0; 

     IncrementorThread A= new IncrementorThread(1, aHolder); 
     IncrementorThread B= new IncrementorThread(2, aHolder); 
     IncrementorThread C= new IncrementorThread(3, aHolder); 

     A.start(); 
     B.start(); 
     C.start(); 

     A.join(); 
     B.join(); 
     C.join(); 
     System.out.println("All threads completed..."); 

    } 

} 

Welche für alle Threads abgeschlossen warten. Wenn ich Executors wie folgt aus:

public class Main 
{ 

    public static void main(String[] args) 
    { 
     // TODO Auto-generated method stub 
     IntHolder aHolder=new IntHolder(); 
     aHolder.number=0; 

     IncrementalRunable A= new IncrementalRunable(1, aHolder); 
     IncrementalRunable B= new IncrementalRunable(2, aHolder); 
     IncrementalRunable C= new IncrementalRunable(3, aHolder); 

     ExecutorService exec = Executors.newFixedThreadPool(3); 
     exec.execute(A); 
     exec.execute(B); 
     exec.execute(C); 
     //Don't know what to do here 

     System.out.println("All threads completed..."); 
    } 
} 

Wie kann ich den Hauptthread suspendieren für alle Fäden in der Testamentsvollstrecker zu warten, um zu beenden, dh die „Alle Threads abgeschlossen ...“ sollte nach dem alle gedruckt werden Threads haben ihre Arbeit gemacht?

+0

Check this: http://stackoverflow.com/questions/3269445/executorservice-how-to-wait-for-all-tasks-to-finish – giorashc

+0

Zukunft aa hat blocking get method –

Antwort

11
executor.shutdown(); 
while (!executor.awaitTermination(24L, TimeUnit.HOURS)) { 
    System.out.println("Not yet. Still waiting for termination"); 
} 

Verwendung shutdown() + awaitTermination() Kombination.

EDIT:

Basierend auf dem Kommentar von @Lital

List<Callable<Object>> calls = new ArrayList<Callable<Object>>(); 
calls.add(Executors.callable(new IncrementalRunable(1, aHolder))); 
calls.add(Executors.callable(new IncrementalRunable(2, aHolder))); 
calls.add(Executors.callable(new IncrementalRunable(3, aHolder))); 

List<Future<Object>> futures = executor.invokeAll(calls); 

HINWEIS: invokeAll() wird nicht zurückkehren, bis alle Aufgaben abgeschlossen sind (entweder durch Fehler oder Abschluss erfolgreiche Ausführung) .

+1

Denkst du nicht, dass es nicht gut ist, einen Thread-Pool nur wegen einer einfachen Verbindung herunterzufahren? – Lital

+1

@Lital Ich habe einen weiteren raffinierten Ansatz hinzugefügt, der verfolgt werden kann. –

+0

@NarendraPathai, großartig, das ist noch besser, aber ändere die Nummern auf 1,2,3 (das sind Thread-Nummern, die ich zum Drucken von Nachrichten verwende) –

0
exec.shutdown(); 
    // Wait until all threads are finish 
    exec.awaitTermination(); 
12

Sie sollten den Executor nicht wie folgt verwenden, wenn Sie auf den Abschluss der Tasks warten möchten. Was ist, wenn Sie Ihren Thread Pool Executor nicht herunterfahren wollen/können? Dies ist eine empfohlene Methode:

ExecutorService exec = Executors.newFixedThreadPool(3); 
    Collection<Future<?>> tasks = new LinkedList<Future<?>>(); 

    Future<T> future = exec.submit(A); 
    tasks.add(future); 
    future = exec.submit(B); 
    tasks.add(future); 
    future = exec.submit(C); 
    tasks.add(future); 

    // wait for tasks completion 
    for (Future<?> currTask : tasks) { 
      try { 
       currTask.get(); 
      } catch (Throwable thrown) { 
       Logger.error(thrown, "Error while waiting for thread completion"); 
      } 
     } 
+0

Ich stimme zu, dass ich solche Vollstrecker nicht verwenden sollte, aber ich mache jetzt nur mit Java herum und ich war neugierig, wie ich das erreichen könnte –