0

私のコードでは、一連のスレッドを開始していくつかのタスクを実行するために CompletionService と ExecutorService を使用しています (これには多くの時間がかかる可能性があります)。ExecutorService と CompletionService を作成し、スレッドの送信を開始して結果を取得するメソッドがあります。エグゼキューターを正常にシャットダウンするために、シャットダウン フックを追加したいと思います (おそらく、エグゼキューターのシャットダウンではなくリソースの解放を処理する必要があることはわかっていますが、私の場合、各スレッドには独自のリソースがあるため、それらを正常にシャットダウンすることは良い解決策になる可能性があります)。仮定する)。

このため、次のコードを記述します

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);
                }
            }
        });

}
}

これは合理的な解決策だと思いますか、それともローカル クラスを使用してシャットダウン フックを登録および登録解除するのは安全ではないと思いますか?

前もって感謝します

よろしく

4

1 に答える 1

2

Shutdown Hooks API の設計から:

単純なシャットダウン フックは、多くの場合、次の例のように匿名の内部クラスとして記述できます。

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

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

于 2016-03-23T10:16:11.383 に答える