我有一个运行不同线程的程序'foo',fooT1,fooT2,... fooTn。
现在,如果我想写另一个程序'bar',这可能会杀死线程fooTr,那可能吗?
原因:其中一个线程fooTr跟踪产品许可证。如果这个线程被杀死;一个人可以无限期地运行这个产品。并且杀死'foo'本身是可以容忍的'foo',因为这正是在许可证到期时所做的事情。
系统:Linux的Fedora发行版
注意:启动JVM和程序foo的命令放在/etc/init.d中,任何对rc.1 / rc.2 / rc.3结构有相当了解的人都可以更改/添加起始参数这些
我希望我的问题很明确。如果没有,我可以随时编辑它。
答案 0 :(得分: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调试器,它看起来像一个线程可以随机杀死。也许你可以确保忽略所有异常并继续运行,这就足够了,但我不确定。
答案 1 :(得分:4)
据我所知,不可能直接这样做。然而你可以考虑在你的'foo'上创建某种服务,可以从'bar'调用来杀死线程。当然,有数百种方法可以实现这一点。我的第一个想法是使用RMI执行此操作。
答案 2 :(得分:3)
即使没有单独的应用程序,您也可以这样做。编写自己的启动类,它将参数传递给应用程序的原始启动类。您的类的主要方法虽然会创建一个线程,定期检查所有线程的列表(例如,Thread.getAllStackTraces
或Thread.enumerate
),找到有问题的线程,并在其上调用stop()
。虽然{@ 1}}已被弃用,但它仍然有效。
另一种选择是在Java调试器下运行应用程序,比如Thread.stop
,然后暂停/终止所需的线程。您还可以向应用程序的启动添加参数,以便可以将JVM连接到,然后将jdb
附加到正在运行的JVM并怀疑/终止该线程。
答案 3 :(得分:1)
直到现在还不可能在同一个JVM中运行不同的程序,但有些人正在调查它,以减少启动时间以及在同一台机器上运行的不同java程序的内存和CPU使用