我需要开发一个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终止于守护程序线程?
答案 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);
此代码也不会终止。