我正在實施一項服務,該服務執行一些較長時間運行的任務,此處由Thread.sleep(10000)
模擬。當我按ctrl + c執行時,我從來沒有得到我期望的InterruptedException
。我想知道爲什麼。關閉ScheduledExecutorService安全嗎?
package simple;
import my.util.Now;
import io.dropwizard.lifecycle.Managed;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class EmailSender implements Managed {
private static final Logger LOGGER = LoggerFactory.getLogger(EmailSender.class);
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);
// Constructor
public EmailSender() {}
@Override
public void start() {
LOGGER.info("Starting email sender thread: {}", Thread.currentThread().getName());
Runnable task =() -> {
LOGGER.info("Running: {} in thread: {}", Now.now(), Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException ie) {
LOGGER.error("Task is being interrupted: {}", ie.getMessage());
}
};
executorService.scheduleAtFixedRate(task, 0, 5, TimeUnit.SECONDS);
}
@Override
public void stop() {
LOGGER.info("Stopping email sender thread: {}", Thread.currentThread().getName());
executorService.shutdown();
}
}
這樣可以安全地假設executorService.shutdown();
等到執行完成任務這樣嗎?
該文檔基本上說明了一切:['關機()'](https://docs.oracle.com/javase/7/ docs/api/java/util/concurrent/ExecutorService.html#shutdown())會阻止執行程序接受新的提交。您可能希望['shutdownNow()'](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#shutdownNow()),它會中斷正在運行的線程。不,後者是不安全的,因爲中斷線程不是很安全。 – dhke