守护程序线程阻止 JVM 终止 - 可能的原因



我需要开发一个可以启动apache ftp-server的maven插件,将其作为守护进程运行(不会停止构建过程)并停止它作为另一个目标。不幸的是,我第一次尝试使用守护程序线程失败了:

public class FtpServerDaemon
{
    public static void main(final String[] args) throws Exception
    {
        Thread thread = new Thread(new Runnable()
                {
                    @Override public void run()
                    {
                        org.apache.ftpserver.main.Daemon.main(args);
                    }
                });
        thread.setDaemon(true);
        thread.start();
        Thread.sleep(10000);
    }
}

这里的坏事是 JVM 不会在 10 秒后终止,而是无限期运行。如果Daemon.main是黑盒代码(无论源代码如何可用),什么可以阻止 JVM 在守护线程中终止?

同意亚述和克里斯的评论。

您可以在那里尝试其他代码而不是org.apache.ftpserver.main.Daemon.main(args);?一个持续超过主线程睡眠时间的循环,每n秒打印一个数字或其他东西。

我认为它必须适当地终止。只是为了测试ftpserver是否阻止退出。

顺便说一下,如果守护进程线程生成了一个子线程,则子线程会自动设置为守护进程,对吗?那么为什么会发生这种情况呢?

FtpServer 启动非守护程序线程,并且它们仍在运行。如果线程是从守护程序线程生成的,则新线程最初将从其父线程继承守护程序状态,但可以覆盖它。例如:

Thread thread = new Thread(new Runnable()
                {
                    @Override public void run()
                    {
                        Thread embeddedNonDaemon = new Thread(new Runnable()
                                {
                                    @Override public void run()
                                    {
                                        while (true)
                                        {
                                            ;
                                        }
                                    }
                                });
                        embeddedNonDaemon.setDaemon(false);
                        embeddedNonDaemon.start();
                    }
                });
        thread.setDaemon(true);
        thread.start();
        Thread.sleep(5000);

此代码也不会终止。

最新更新