守护程序线程Java

Bis*_*128 7 java concurrency

我是并发和线程的新手 - 并且在开发我的应用程序时一直在使用它们.基本上我在我的RMI应用程序(服务器端组件)中有许多线程来轮询文件中的更改(这些文件每隔几秒更新一次).

在开发盒上进行测试时,我一直在从命令行运行服务器,然后在完成后手动关闭它并在一整天内进行冲洗和重复.

随着它的发生 - 我认为当我关闭命令行并仍然继续处理时,我的线程可能不会停止.这导致了一些非常糟糕的副作用 - 虽然我不能100%确定这是否可能,所以希望有人可以证实这可能是这种情况.

如果我让一个线程成为一个守护进程 - 这是否意味着当我关闭命令行时 - 这些线程会自动停止?我需要一些方法来很好地终止应用程序,但因为服务器最终将由autosys运行我不确定什么是关闭时所有线程完成的最佳方法

谢谢

Jay*_*Tee 1

以下代码演示了使用虚拟运行任务创建线程池,然后启动该任务,当应用程序终止时,将运行关闭挂钩,取消所有正在运行的任务并彻底关闭线程池。

您不必像我一样使用 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 执行相同的操作