2016-03-23 25 views
0

私のコードでは、(多くの時間がかかります)いくつかのタスクを実行するためにスレッドの束を開始するためにCompletionServiceとExecutorServiceを使用しています。 私はExecutorServiceとCompletionServiceを作成し、スレッドを送信してから結果を取得するメソッドを持っています。 エグゼキュータを正常にシャットダウンするためにシャットダウンフックを追加したいと思います(エグゼキュータのシャットダウンではなく、リソースを解放する必要があるかもしれませんが、私の場合はスレッドごとに独自のリソースがあるので、正常にシャットダウンすると良いでしょう)私は考えます)。私は次のコードJava add shutdown hook insideメソッド

public Class myClass{ 
... 
private CompletionService<ClusterJobs> completion; 
final long SHUTDOWN_TIME = TimeUnit.SECONDS.toSeconds(10); 

... 
public Message executeCommand(Message request){ 

final ExecutorService executor = Executors.newFixedThreadPool(30); 

completion = new ExecutorCompletionService<ClusterJobs>(executor); 

....//submit and take results 

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run() { 
       logger.debug("Shutting down executor"); 

       try { 
        if (!executor.awaitTermination(SHUTDOWN_TIME, TimeUnit.SECONDS)) { 
         logger.debug("Executor still not terminate after waiting time..."); 
         List<Runnable> notExecuted= executor.shutdownNow(); 
         logger.debug("List of dropped task has size " + droppedTasks.size()); 
        } 
       }catch(InterruptedException e){ 
        logger.error("",e); 
       } 
      } 
     }); 

} 
} 

を書くこのため

あなたは、これは合理的な解決策であると思いますか、ローカルクラスを使用してシャットダウンフックを登録し、登録解除する危険なのか?このイディオムは

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { database.close(); } 
}); 

:この例のように

簡単なシャットダウンフックは、多くの場合、匿名内部クラスのように書くことができます:Design of the Shutdown Hooks APIから

よろしく

答えて

1

事前に

感謝フックをキャンセルする必要がない限り、問題はありません。その場合、フックを作成するときにフックへの参照を保存する必要があります。