我有一个 Java 小程序,它创建一个新的非守护线程,如下所示:
Thread childThread = new Thread(new MyRunnable(_this));
childThread.setDaemon(false);
childThread.start();
然后我的 MyRunnable
对象调用用 C++ 实现的 native 方法:
@Override
public void run() {
while (true) {
if (!ran) {
System.out.println("isDaemon: " + Thread.currentThread().isDaemon());
_applet.invokePrintManager(_applet.fFormType,
_applet.fFormName, _applet.fPrintImmediately,
_applet.fDataSet);
ran = true;
}
}
}
此 C++ 方法调用显示表单的 C# DLL。我的问题是,每当用户离开带有 Java 小程序的页面时,JVM(和我的 C# 表单)就会被终止。我需要表单和 JVM 保持打开状态,直到用户将其关闭。我尝试将我的线程设置为非守护线程,这是有效的,因为 System.out.println("isDaemon: "+ Thread.currentThread().isDaemon()
打印 isDaemon:假
。
是否有与 C# 表单创建方式相关的内容(是否有另一个我没有考虑到的线程)或我忽略的内容?我的线程不是守护线程,但 JVM 无论如何都会被杀死。
最佳答案
一旦运行小程序的所有页面都关闭,为小程序启动的 JVM 就会终止。这是为了避免恶意或损坏的页面占用您计算机上的资源。为了避免这种情况,您有多种选择。您可以让小程序的持久部分在用户无法离开的框架中运行。或者,当他们尝试离开时,您可以发出警告(就像您输入部分问题时 Stack Overflow 所做的那样)。或者您可以使用其他一些服务器端持久性。或者您可以尝试使用 webstart 而不是小程序。
关于使用 JNI 的 Java 守护线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280199/