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

时间:2014-03-06 11:28:34

标签: java multithreading jvm

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

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是黑盒代码(但源是available),那么什么可以阻止JVM终止于守护程序线程?

2 个答案:

答案 0 :(得分:1)

同意assylias和chrylis评论。

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

我相信它必须正确终止。只是为了测试ftpserver是否阻止退出。

顺便说一句,如果守护程序线程产生子线程,子线程会自动设置为守护进程,对吧?那么为什么会这样呢?

答案 1 :(得分:0)

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

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);

此代码也不会终止。