7

我有一个程序'foo'运行不同的线程,fooT1,fooT2,.. fooTn。

现在,如果我想编写另一个程序“bar”,它可能会杀死线程 fooTr,这可能吗?

原因:线程 fooTr 跟踪产品许可证之一。如果这个线程被杀死;一个人可以无限期地运行这个产品。杀死“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

即使没有单独的应用程序,您也可以这样做。编写您自己的启动类,该类将参数传递给应用程序的原始启动类。您的类的 main 方法虽然会创建一个线程,该线程会定期检查所有线程的列表(例如,Thread.getAllStackTracesThread.enumerate),找到有问题的线程,并在其上调用stop()。尽管Thread.stop已弃用,但它仍然有效。

另一种选择是在 Java 调试器下运行应用程序,例如,jdb然后挂起/终止所需的线程。您还可以向应用程序的启动添加参数,以便可以附加 JVM,然后附加jdb到正在运行的 JVM 并怀疑/杀死线程。

于 2008-10-09T19:29:58.073 回答
1

到目前为止,不可能在同一台JVM中运行不同的程序,但有人正在研究它,以减少在同一台机器上运行的不同java程序的启动时间和内存和cpu使用率

于 2008-10-08T10:36:57.743 回答