Exception Handlingを正しく実装しなかった場合、タスクはExeuctorServiceにタスクを送信する方法によって消滅します。
FixedThreadPool
を使用しているため、固定されたスレッド数はスレッドが死んでも保持する必要があります。
submitの代わりにexecuteを使用すると、処理されない例外が発生した場合にスレッドが終了します。
輸入java.util.concurrentのを使用して例外&スレッド死をシミュレートするサンプルコード*。;
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();
}
}
今出力にスレッド名を確認してください。Runnable
タスクを提出しながら、
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
は今だけsubmit
でexecute
を交換してください。例外は飲み込まされ、出力は次のようなものです:スレッドの作成の詳細については
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
(FixedThreadPoolサイズは2であるので、あなたは、2つだけのスレッドを見ることができます)、このgrepcodeのリンクを参照してください。
private boolean addWorker(Runnable firstTask, boolean core)
これは私が質問なしで探していた答えでなければならない、 清潔で完全なヒントのためのthx! – BinaryProbe
submit()メソッドで例外を捕捉するために関連するSE質問をチェックすることができます:http://stackoverflow.com/questions/3929342/choose-between-executorservices-submit-and-executorservices-execute/35424481#35424481 –