下面的代码演示了创建一个带有虚拟运行任务的线程池,然后启动该任务,当应用程序终止时,一个关闭挂钩运行,它取消所有正在运行的任务并干净地关闭线程池。
您不必像我一样使用 Callable,您可以使用 Runnables 和 threadPool.execute 方法并简单地终止线程池,这有点不那么优雅。
final ExecutorService threadPool = Executors.newCachedThreadPool();
final List<Future<Void>> runningTasks = new ArrayList<>();
Future<Void> task = threadPool.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
int count = 0;
while(true) {
System.out.println(++count);
Thread.sleep(1000);
}
}
});
runningTasks.add(task);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
for(Future<Void> runningTask : runningTasks) {
runningTask.cancel(true);
}
threadPool.shutdownNow();
}
});
关闭挂钩适用于独立应用程序。在 Java EE 容器中,您可以对 javax.servlet.ServletContextListener 执行相同的操作