2016-06-17 3 views
1

Wenn ich ExecutorService.shutdownNow() im Haupt-Thread ausführt, stoppt es nicht alle Threads, aber wenn ich ExecutorService.shutdownNow() in Thread1 oder Thread2 ausführt, wird es seine untergeordneten Unterthreads Wie kaskadieren Herunterfahren Befehl auf die niedrigste Ebene?Wie alle Threads in der Struktur gestoppt werden?

 Main thread 
     / \ 
    /  \ 
Thread 1 Thread 2 
| | |  | |  
A B C  D E 

Wie alle Threads vom Hauptthread zu töten?

unter Schnipsel mit Thread craete

CompletionService<Object> completionService = new ExecutorCompletionService<Object>(threadExecutor); 
         List<Future<Object>> futures = new ArrayList<Future<Object>>(); 
         for(MultiThread mt : threadList) 
         { 
         futures.add(completionService.submit(mt)); 
         } 

         while (futures.size() > 0) { 
          Future f = completionService.take(); 
          futures.remove(f); 
          try { 
           Object result = f.get(); 
           System.out.println(result); 
          } catch (Exception e) { 
           System.out.println("Caught exception from one task: " + e.getCause().getMessage() + ". shutdown now!"); 
           threadExecutor.shutdownNow(); 
           break; 
          } 
         } 

Wie Unterbrechung Kind Thread zu handhaben?

+0

Wie viele 'Executor's haben Sie? Haben Sie bei allen die Instanzmethode 'shutdownNow()' aufgerufen? –

+0

Ich habe 2 Executoren ... 1 im Haupt-Thread und die andere in seinem Kind-Thread, die thread1 und thread 2. erstellt. Ich habe shutdownNow() auf beiden Executor aber ich denke, nur thread1 und thread2-Executoren shutdownNow() arbeitet – happy

+0

Aus meiner Erfahrung mit Multithreading müssen Sie jeden Thread durchlaufen und ihn auf null setzen oder ihn beenden, wie Sie es gerade tun. Normalerweise möchte ich meine Threads erstellen, indem ich Runnable implementiere. – Dominic

Antwort

1

shutdownNow Liste shutdownNow() Basierend auf Javadoc: Versuche, alle aktiv Ausführung von Aufgaben zu stoppen, stoppt die Verarbeitung des Wartens Aufgaben und gibt eine Liste der Aufgaben, die die Ausführung erwarteten. Diese Methode wartet nicht auf das aktive Ausführen von Tasks zum Beenden. Verwenden Sie awaistTermination, um dies zu tun.

Es gibt keine Garantien jenseits von Best-Effort-Versuchen, die Ausführung aktiv ausgeführter Aufgaben zu stoppen. Zum Beispiel werden typische Implementierungen über Thread.interrupt() abgebrochen, so dass jede Task, die nicht auf Interrupts reagiert, niemals beendet wird.

+0

Möglich, dass Ihre laufende Aufgabe nicht zu einem Interrupt-Ereignis führt und nicht antwortet. –

0

Sie können einen ThreadPoolExecutor verwenden und eine Instanz einer ThreadFactory übergeben. Die ThreadFactory verwendet eine eindeutige ThreadGroup, die jedem neu erstellten Thread zugeordnet ist. Wenn Sie alle Threads unterbrechen müssen, können Sie einfach die ThreadGroup-Interrupt-Methode verwenden und alle Threads werden unterbrochen.

public class GroupThreadFactory implements ThreadFactory { 
    private ThreadGroup group; 

    public GroupThreadFactory(ThreadGroup group) { 
     this.group = group; 
    } 

    public Thread newThread(Runnable r) { 
     return new Thread(group, r); 
    } 
} 
Verwandte Themen