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)
Dies sollte die Antwort sein, die ich ohne Frage gesucht habe, thx für saubere und vollständige Tipps! – BinaryProbe
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 –