我是并发和线程的新手 - 并且在开发我的应用程序时一直在使用它们.基本上我在我的RMI应用程序(服务器端组件)中有许多线程来轮询文件中的更改(这些文件每隔几秒更新一次).
在开发盒上进行测试时,我一直在从命令行运行服务器,然后在完成后手动关闭它并在一整天内进行冲洗和重复.
随着它的发生 - 我认为当我关闭命令行并仍然继续处理时,我的线程可能不会停止.这导致了一些非常糟糕的副作用 - 虽然我不能100%确定这是否可能,所以希望有人可以证实这可能是这种情况.
如果我让一个线程成为一个守护进程 - 这是否意味着当我关闭命令行时 - 这些线程会自动停止?我需要一些方法来很好地终止应用程序,但因为服务器最终将由autosys运行我不确定什么是关闭时所有线程完成的最佳方法
谢谢
以下代码演示了使用虚拟运行任务创建线程池,然后启动该任务,当应用程序终止时,将运行关闭挂钩,取消所有正在运行的任务并彻底关闭线程池。
您不必像我一样使用 Callable,您可以使用 Runnables 和 threadPool.execute 方法,然后简单地终止 threadPool,这有点不太优雅。
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();
}
});
Run Code Online (Sandbox Code Playgroud)
关闭挂钩适用于独立应用程序。在 Java EE 容器中,您可以使用 javax.servlet.ServletContextListener 执行相同的操作
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |