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的 s 正确检查中断并自愿终止,则池将很快停止。否则,它相当于shutdown().

在 Java 中,没有办法强制终止线程(Thread.stop()已弃用,因为它容易发生资源泄漏和死锁)。您只能要求线程终止(调用它的interrupt()方法),但您的代码需要定期检查Thread.interrupted()并正确使用InterruptedExceptions.

礼貌工作者的一个例子是这样的:

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 回答