理论上,正如评论中提到的,这是一个很难真正解决的问题。
实际解决方案的最大希望...
我在这里假设您想要一种更可靠、更安全的方式来杀死和分析正在运行的 clojure 线程中的活动。. . 为此,JPS 是可行的方法,因为 JPS 监视所有 Java 进程,包括您在标准 clojure 中所做的任何事情。
我总是将 JPS 用于此类事情,因为它可用于显示特定 java 类的进程名称,包括类名......知道最初调用进程的类的能力让您对“什么”你实际上在杀人。
doolittle-5:~ Jpeerindex$ jps -l
61133 jline.ConsoleRunner
58998 start.jar
61161 sun.tools.jps.Jps
51866 jline.ConsoleRunner
在这种情况下,由于“lein repl”(clojure repl)是通过 jline(主类是 ConsoleRunner)启动的,所以我们可以看到它。
如果您确实需要查看详细信息,可以选择其中任何一个进程并使用 jstack 调用它们:
$>jstack 51866
“Gang worker#0(并行 GC 线程)”prio=9 tid=101802800 nid=0x1017f9000 可运行
“Gang worker#1(并行 GC 线程)”prio=9 tid=101803800 nid=0x102301000 可运行
“并发 Mark-Sweep GC 线程”prio=9 tid=10184e000 nid=0x1093f0000 可运行“VM 周期性任务线程”prio=10 tid=1018a4000 nid=0x10a310000 等待条件
“异常捕获线程”prio=10 tid=101802000 nid=0x100704000 可运行 JNI 全局引用:137
在这种情况下,您将能够感觉到您的线程中是否存在任何实际问题,准确地识别它们,并自信地杀死它们,等等......