2016-08-02 35 views
2

Gemäß dem Dokument newFixedThreadPool in Testamentsvollstrecker in Bezug auf, fand ichWann schlägt ExcecutorService während der Ausführung fehl?

Wenn ein Thread aufgrund eines Fehlers beendet während der Ausführung vor shutdown, ein neues Geschäft wird seinen Platz einnehmen, wenn nachfolgenden Aufgaben auszuführen benötigt.

Während ich meinen Code ausführen, entdeckte ich meine feste Größe Threadpool mit einer Kapazität 5 keep Erzeugung Fäden wie die Zeit wie pool-1-thread-3212 geht die pool-1-thread-5 or less

So sein glaube, ich frage mich, wann ist ExecutorService eines seiner Thread entscheiden versagt und starte einen neuen.

Könnte mir jemand den Grund erklären, warum dies geschieht?

Antwort

2

Wenn Sie die Ausnahmebehandlung nicht ordnungsgemäß implementiert haben, wird der Thread abhängig davon, wie Sie die Aufgabe an ExecectorService übergeben haben, ungültig.

Da Sie FixedThreadPool verwenden, muss die feste Anzahl von Threads im Falle eines Fadentodes beibehalten werden.

Wenn Sie execute anstelle von submit verwenden, wird Thread im Fall von nicht behandelten Ausnahmen sterben.

Beispielcode die Ausnahme & Thread Tod unter Verwendung execute()

import java.util.concurrent zu simulieren. *;

import java.util.*; 

public class ThreadDeath{ 
    public ThreadDeath() 
    { 
     System.out.println("creating service"); 
     ExecutorService service = Executors.newFixedThreadPool(2); 
     for (int i=0; i < 5; i++){ 
      service.execute(new Runnable(){ 
        public void run(){ 
         int a=4, b = 0; 
         System.out.println("Thread Name before divide by zero:"+Thread.currentThread().getName()); 
         System.out.println("a and b="+a+":"+b); 
         System.out.println("a/b:"+(a/b)); 

        } 
       }); 
     } 
     service.shutdown(); 
    } 
    public static void main(String args[]){ 
     ThreadDeath test = new ThreadDeath(); 
    } 
} 

nun die in Ausgabe-Thread Namen überprüfen:

creating service 
Thread Name before divide by zero:pool-1-thread-1 
Thread Name before divide by zero:pool-1-thread-2 
a and b=4:0 
a and b=4:0 
Exception in thread "pool-1-thread-1" Thread Name before divide by zero:pool-1-thread-3Exception in thread "pool-1-thread-2" 
a and b=4:0 
Thread Name before divide by zero:pool-1-thread-4 
Exception in thread "pool-1-thread-3" a and b=4:0java.lang.ArithmeticException:/by zero 

Thread Name before divide by zero:pool-1-thread-5 

Jetzt nur execute mit submit ersetzen, während der Runnable Aufgabe einreichen. Die Ausnahme geschluckt wird und ausgegeben wird wie folgt aus: (Sie können nur zwei Threads sehen, da FixedThreadPool Größe 2)

creating service 
Thread Name before divide by zero:pool-1-thread-1 
a and b=4:0 
Thread Name before divide by zero:pool-1-thread-2 
a and b=4:0 
Thread Name before divide by zero:pool-1-thread-1 
a and b=4:0 
Thread Name before divide by zero:pool-1-thread-2 
Thread Name before divide by zero:pool-1-thread-1 
a and b=4:0 
a and b=4:0 

Weitere Informationen zu Thema Schöpfung, beziehen sich auf diese grepcode Link:

private boolean addWorker(Runnable firstTask, boolean core) 
+0

Dies sollte die Antwort sein, die ich ohne Frage gesucht habe, thx für saubere und vollständige Tipps! – BinaryProbe

+0

Sie können verwandte SE-Fragen überprüfen, um Ausnahmen mit der Methode submit() abzufangen: http://stackoverflow.com/questions/3929342/choose-between-executorservices-submit-and-executorservices-execute/35424481#35424481 –