2016-08-02 11 views
2

エグゼキュータにnewFixedThreadPoolに関する文書によると、私が原因 後続のタスクを実行するために必要な場合は、新しいものが行われます シャットダウンする前に、実行中に障害に実行中にExcecutorServiceが失敗するのはいつですか?

いずれかのスレッドが終了した場合を発見しました。

私は私のコードを実行している間、私は時間がpool-1-thread-5 or less

すると仮定されpool-1-thread-3212のように行くようExecutorServiceのは、そのスレッドの1失敗を決めるんときに、私は疑問に思う容量5キープ生成スレッドで私の固定サイズのスレッドプールを検出新しいものを立ち上げる。

誰も私にこれが起こる理由を導くことができますか?

答えて

2

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 

は今だけsubmitexecuteを交換してください。例外は飲み込まされ、出力は次のようなものです:スレッドの作成の詳細については

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) 
+0

これは私が質問なしで探していた答えでなければならない、 清潔で完全なヒントのためのthx! – BinaryProbe

+0

submit()メソッドで例外を捕捉するために関連するSE質問をチェックすることができます:http://stackoverflow.com/questions/3929342/choose-between-executorservices-submit-and-executorservices-execute/35424481#35424481 –

関連する問題