【问题标题】:Java threads: Is it possible view/pause/kill a particular thread from a different java program running on the same JVM?Java 线程:是否可以从在同一 JVM 上运行的不同 Java 程序查看/暂停/杀死特定线程?
【发布时间】:2010-09-15 22:44:04
【问题描述】:

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

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

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

系统:Linux 的 Fedora 发行版

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

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

【问题讨论】:

  • 嗯,所以你问我们如何绕过商业产品的许可?怀疑 Stackoverflow 使用条款是否允许这样做...
  • ...还是想知道如何保护自己的产品不被破解?
  • 抱歉这么晚才回答,我想保护某个产品(不是我自己的)。

标签: java multithreading jvm


【解决方案1】:

实际上,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 调试器,但在我看来,线程可以被随机杀死。也许您可以确保忽略所有异常并继续运行就足够了,但我不确定。

【讨论】:

    【解决方案2】:

    据我所知,无法直接执行此操作。但是,您可以考虑在您的“foo”上创建某种服务,可以从“bar”调用该服务以终止线程。当然,有数百种方法可以实现这一点。我的第一个想法是使用RMI。

    【讨论】:

    • 感谢您的回答。我只是想确保 bar not 能够终止线程。看起来 Java 确实提供了这么多的安全性。
    • 如果有人想破解您的许可代码,他们可以随时反编译您的类并用跳过许可检查的版本替换它。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多