我需要开发一个可以启动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);
此代码也不会终止。