2010-12-16 9 views
1

私はスレッドを拡張するクラスを持っており、起動するとjarのMainメソッドが実行されます。スレッドを終了すると、開始したプロセスは終了しません。それについてどうすればいいですか?ありがとう!jarを実行するスレッドを終了する

私のカスタムスレッドクラスのrun()メソッドがある場合、以下のようになります。

@Override 
    public void run() { 
     if(parent != null) { 
      MessageConsole console = new MessageConsole(parent.getConsole().getTextPane()); 
      console.redirectOut(new Color(240, 240, 240), null); 
      console.redirectErr(Color.RED, null); 
      console.setMessageLines(20); 
     } 
     if(oParent != null) { 
      MessageConsole console = new MessageConsole(oParent.getConsole().getTextPane()); 
      console.redirectOut(new Color(240, 240, 240), null); 
      console.redirectErr(Color.RED, null); 
      console.setMessageLines(20); 
     } 
     try { 
      somejar.SomeJar.main(args); 
     } catch (Exception ex) { 
      System.err.println("Engine failed to start!\nSuggestion: Restart the application, and if the issue is not fixed reinstall the application."); 
     } 
    } 

答えて

3

スレッドを終了すると、開始されたプロセスは強制終了されません。それについてどうすればいいですか?

信頼性の高い方法はありません。

まず、スレッドを確実に終了する方法はありません。好ましい方法はです。このスレッドでThread.interrupt()を呼び出すことですが、これは無視されます。 と非推奨のメソッドThread.stop()を呼び出すと、JVMが不安定になる可能性があります。

第2に、JARスレッドを終了しても、作成した子スレッドを確実に終了することはできません。子スレッドをアプリケーションの他の部分で作成された他のスレッドと確実に区別することはできません。もしあなたがそれらを特定できれば、それらを確実に殺すことはできません。

あなたができることは、JVMを実行する外部プロセスとして新しいJVMを起動することです。通常の状況下では、JVMは作成した外部プロセスを確実に終了させることができます。 (setuidコマンドなどの例外がありますが、ここでは問題ではありません)。

+0

@Stephen Cは、これが最適なソリューションであると考えています。そのオプションでない場合、子スレッドを識別する方法の1つは、新しいスレッドグループで最初のスレッドを開始することです。子グループはデフォルトで同じグループ内で開始されます。それは信頼できるものではありませんが、何よりも良いかもしれません。 –

+0

@Peter Lawrey - ThreadGroupsはあまりにも信頼性がありません。たとえば、それらに頼った場合、JARスレッドが所有していないスレッドを強制終了させる可能性があります。それは何もないよりも激しいことがあります。 –

+0

私はすべての子供たちを列挙してそれぞれを殺すことができる方法はありますか?あるいは、各スレッドのプロセスIDを取得し、個別に終了させることができますか? – Jakir00

0

プロセスを終了することなくスレッドを終了することはできません。

たとえば、停止するように通知することができます。 interrupt()または例外をスローしますが、停止させる唯一の方法は、run()メソッドからThrowableを返すかスローすることです。

関連する問題