Java线程:是否可以从同一JVM上运行的不同java程序查看/暂停/终止特定线程?

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

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

原因:其中一个线程fooTr跟踪产品许可证。 如果这个线程被杀死; 一个人可以无限期地运行这个产品。 并且杀死’foo’本身是可以容忍的’foo’,因为这正是许可证到期时所做的。

系统:Linux的Fedora发行版

注意:启动JVM和程序foo的命令放在/etc/init.d中,任何对rc.1 / rc.2 / rc.3结构有相当了解的人都可以更改/添加起始参数。

我希望我的问题很清楚。 如果没有,我总是可以编辑它。

据我所知,不可能直接这样做。 然而,你可以考虑在你的’foo’上创建某种服务,可以从’bar’调用来杀死线程。 当然,有数百种方法可以实现这一点。 我的第一个想法是使用RMI来做到这一点。

实际上,java调试器将允许您通过向其中注入exception来终止线程。 当我遇到这个问题时,我只是试图弄清楚如何使用这个function杀死一个线程而不会消灭整个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调试器,它看起来像一个线程可以随机杀死。 也许你可以确保你忽略所有exception并继续运行,这就足够了,但我不确定。

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

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

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