0

次のような新しい非デーモン スレッドを作成する Java アプレットがあります。

  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 アプレットを含むページから移動するたびに、JVM (および私の C# フォーム) が強制終了されることです。ユーザーがフォームを閉じるまで、フォームと JVM を開いたままにしておく必要があります。スレッドを非デーモンスレッドに設定しようとしましたが、これはSystem.out.println("isDaemon: " + Thread.currentThread().isDaemon()印刷のために機能していますisDaemon: false

C#フォームの作成方法に関連するものはありますか(私が説明していない別のスレッドはありますか)、または私が見落としているものはありますか?? 私のスレッドはデーモン スレッドではありませんが、とにかく JVM が強制終了されています。

4

1 に答える 1

1

アプレット用に開始された JVM は、アプレットを実行しているすべてのページが閉じられると終了します。これは、悪意のあるページや壊れたページがコンピューターのリソースを占有するのを防ぐためです。これを回避するには、いくつかの代替手段があります。ユーザーが移動しないフレームでアプレットの永続的な部分を実行することができます。または、別の場所に移動しようとしたときに警告を発することもできます (質問の一部を入力したときに Stack Overflow が行うように)。または、他のサーバー側の永続性を使用することもできます。または、アプレットの代わりに webstart を使用することもできます。

于 2013-06-24T19:53:26.897 に答える