使用JNI进行Java守护程序线程处理

时间:2013-06-24 16:18:07

标签: java multithreading applet jvm daemon

我有一个Java applet,可以创建一个新的非守护程序线程,如下所示:

  Thread childThread = new Thread(new MyRunnable(_this));
  childThread.setDaemon(false);
  childThread.start();

然后我的MyRunnable对象调用在C ++中实现的本机方法:

  @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 applet导航离开页面时,JVM(和我的C#表单)就会被杀死。我需要表单和JVM保持打开状态,直到用户关闭它。我尝试将我的线程设置为非守护程序线程,因为System.out.println("isDaemon: " + Thread.currentThread().isDaemon()打印isDaemon: false,所以它正常工作。

是否存在与创建C#表单的方式相关的东西(是否有另一个我不考虑的线程)或者我正在忽略的东西?我的线程不是守护程序线程,但JVM正在被杀死。

1 个答案:

答案 0 :(得分:1)

一旦运行applet的所有页面都关闭,就会终止为Applet启动的JVM。这是为了避免恶意或损坏的页面占用计算机上的资源。为避免这种情况,您有几种选择。您可以让applet的持久部分在用户不会离开的框架中运行。或者你可以在他们试图离开时发出警告(就像你输入一部分问题时Stack Overflow一样)。或者您可以使用其他一些服务器端持久性。或者您可以尝试使用webstart而不是applet。