0
 if (isDownloadLogRequired) {
        ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
        for (HostGenericServiceTicket hostGenericServiceTicket : hostGenericServiceTickets) {
            pool.submit(new DiagnosticLogDownloader(logNames, downloadTo, hostGenericServiceTicket));
        }
        pool.shutdown();
        try {
            pool.awaitTermination(downloadTimeout, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            System.err.println(MessageFormat.format("{0}: Reason: {1}", e.getClass()
                    .getSimpleName(), e.getMessage()));
        }
    }

downloadTimeout が 180 秒に設定されている場合、スレッドは強制終了され、プログラムは正しく終了するはずですか?

4

1 に答える 1

4

いいえ。タイムアウトは、待機する時間です。すべてのタスクが実行されると、スレッドプールは終了します。

を呼び出すshutdown()と、スレッドプールは新しいジョブをキューに入れません (ただし、実行中のジョブを停止せず、既にキューに入れられているジョブを実行します)。

を呼び出すとshutdownNow()、新しいジョブは開始されず、作業中のスレッドに割り込みが送信されます。が適切Runnableに割り込みをチェックし、自発的に終了すると、プールはすぐに停止します。それ以外の場合は、 と同等shutdown()です。

Java では、スレッドを強制的に終了する方法はありません (Thread.stop()リソース リークとデッドロックが発生しやすいため、非推奨です)。スレッドに終了を要求する (そのメソッドを呼び出す) ことしかできませんが、 sinterrupt()を定期的にチェックしThread.interrupted()て適切に使用するのはコード次第InterruptedExceptionです。

丁寧な労働者の例は次のようなものです。

public class PoliteWorker implements Runnable {
    private boolean successful = false;
    public void run() {
        while (...) {
            if (Thread.interrupted()) {
                myLogger.log(Level.INFO, "Thread was interrupted. Aborting...");
                return;
            }
            ...
            try {
                String line = myInput.readLine();
            } catch (InterruptedIOException ex) {
                //Must terminate
                myLogger.log(Level.INFO, "Thread was interrupted. Aborting...", ex);
                return;
            } catch (IOException ex) {
                //handle other exceptions
            }
        }
        successful = true;
    }
}
于 2013-08-22T22:45:01.347 に答える