使用 JNI 的 Java 守护线程

标签 java multithreading applet jvm daemon

我有一个 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/

相关文章:

java - maven如何进行Jar下载?

java - 运行我的小程序所需的最低 Java 版本

python - 如何在Python中使用队列处理线程中的异常?

java - 不兼容的魔法值 1008813135

java - Java不支持的主要次要版本52.0

java - 启动应用程序时后台服务杀死我的应用程序

java - j2me中是否可以同时打开和编辑2个或更多的RecordStores?

java - JSON转换和应用程序兼容性问题

java - 将周期性任务与另一个线程同步

java - @Async 与 Spring 3.0.6