7

異なるスレッド fooT1、fooT2、.. fooTn を実行するプログラム 'foo' があります。

スレッドfooTrを殺すことができる別のプログラム「バー」を書きたいのですが、それは可能ですか?

理由: スレッド fooTr の 1 つが製品ライセンスを追跡します。このスレッドが強制終了された場合。この製品を無期限に実行できます。そして、'foo' 自体を強制終了することは、'foo' として許容されます。これは、まさにライセンスの有効期限が切れたときに行われることだからです。

システム: Linux の Fedora ディストリビューション

注: JVM を開始して foo をプログラムするコマンドは /etc/init.d に配置され、rc.1/rc.2/rc.3 構造について十分な知識を持っている人なら誰でも、これらの開始パラメーターを変更/追加できます。

私の質問が明確であることを願っています。そうでない場合は、いつでも編集できます。

4

4 に答える 4

13

実際には、Java デバッガーを使用すると、スレッドに例外を挿入してスレッドを強制終了できます。この質問に出くわしたとき、私はこの機能を使用してjvm全体を一掃せずにスレッドを強制終了する方法を考え出そうとしていました。次のようなコマンド ライン オプションを指定して jvm を実行すると、次のようになります。

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 your.app.Main

デバッガーを次のように接続します。

jdb -attach 127.0.0.1:8888

次のように入力できます。

threads

実行中のスレッドのリストを取得し、kill コマンドを使用して実行中のスレッドを強制終了します。私が現在確信していないのは、このkillコマンドの構文です。私は明らかなことを試しました:

kill 0xe2e new java.lang.IllegalArgumentException("er");

そして私はメッセージを受け取ります:

killing thread: Swank REPL Thread
Thread not suspended
Expression must evaluate to an object

(「Swank REPL Thread」は、私が殺したいスレッドです。はい、最初に一時停止しようとしました;)

まだJavaデバッガを使用できないことはさておき、スレッドがランダムに強制終了される可能性があるように見えます。たぶん、すべての例外を無視して実行し続けることを確認するだけで十分でしょうが、それについてはわかりません。

于 2009-05-17T10:37:05.430 に答える
4

私の知る限り、これを直接行うことはできません。ただし、考慮できることは、「foo」で、「bar」から呼び出してスレッドを強制終了できるある種のサービスを作成することです。もちろん、これを実装する方法は何百もあります。私の最初の考えは、RMIを使用してこれを行うことです。

于 2008-10-08T09:51:26.853 に答える
3

別のアプリケーションがなくても、これを行うことができます。アプリケーションの元のスタートアップ クラスへのパラメーターのパススルーを実行する、独自のスタートアップ クラスを記述します。ただし、クラスのメイン メソッドは、すべてのスレッド (Thread.getAllStackTracesまたは などThread.enumerate) のリストを定期的にチェックし、問題のあるスレッドを見つけて、それを呼び出すスレッドを作成しますstop()。非推奨ですがThread.stop、それでも機能します。

もう 1 つのオプションは、たとえば Java デバッガーでアプリケーションを実行してからjdb、必要なスレッドを一時停止/強制終了することです。また、アプリケーションのスタートアップにパラメーターを追加して、JVM をアタッチできるようにjdbし、実行中の JVM にアタッチして、スレッドを疑う/強制終了することもできます。

于 2008-10-09T19:29:58.073 に答える
1

これまで、同じ JVM で異なるプログラムを実行することはできませんでしたが、同じマシンで実行されている異なる Java プログラムの起動時間とメモリと CPU の使用量を削減するために、調査している人もいます。

于 2008-10-08T10:36:57.743 に答える