50

shutdownNow()私が電話するかshutdown()、シャットダウンしないときはいつでも。シャットダウンが保証されていないというスレッドをいくつか読みました。

4

2 に答える 2

91

典型的なパターンは次のとおりです。

executorService.shutdownNow();
executorService.awaitTermination();

を呼び出すshutdownNowと、エグゼキュータは (通常) 管理しているスレッドに割り込もうとします。シャットダウンを正常に行うには、中断された例外をスレッドでキャッチするか、中断されたステータスを確認する必要があります。そうしないと、スレッドが永久に実行され、executor がシャットダウンできなくなります。これは、Java でのスレッドの中断が共同プロセスであるためです (つまり、中断するコードではなく、中断されたコードが停止を要求されたときに何かを実行する必要があります)。

たとえば、次のコードはExiting normally.... しかし、行をコメントアウトするif (Thread.currentThread().isInterrupted()) break;Still waiting...、エグゼキューター内のスレッドがまだ実行されているため、出力されます。

public static void main(String args[]) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.submit(new Runnable() {

        @Override
        public void run() {
            while (true) {
                if (Thread.currentThread().isInterrupted()) break;
            }
        }
    });

    executor.shutdownNow();
    if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
        System.out.println("Still waiting...");
        System.exit(0);
    }
    System.out.println("Exiting normally...");
}

または、次のように記述することもできますInterruptedException

public static void main(String args[]) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.submit(new Runnable() {

        @Override
        public void run() {
            try {
                while (true) {Thread.sleep(10);}
            } catch (InterruptedException e) {
                //ok let's get out of here
            }
        }
    });

    executor.shutdownNow();
    if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
        System.out.println("Still waiting...");
        System.exit(0);
    }
    System.out.println("Exiting normally...");
}
于 2012-05-08T18:41:03.317 に答える