理论上,JDB(java调试器)允许杀死单个线程。实践中,可能吗?这里我将 jdb 连接到我的 JVM,它在端口 8000 处有一个 agentlib:
$ jdb -attach 8000
>
我列出了主题:
> threads
Group system:
(java.lang ...
[...]
我找到了有问题的线程并尝试杀死它:
> kill 0x21bb new java.lang.Exception("die!")
killing thead: pool-766-thread-1
> com.sun.tools.example.debug.expr.ParseException: Unable to create java.lang.Exception instance
Expression must evaluate to an object
所以线程不能被杀死?
如何在jdb中创建一个新的异常,并将其交给线程终止?
您可能还运行 jconsole/jvisualvm。我遇到了同样的问题,但后来我关闭了 jconsole,jdb Kill 命令起作用了。
我想我知道你的问题是什么。您不能使用
kill
jdb
线程,除非首先将它们挂起。但 JVM 中的一件奇怪的事情是你无法挂起正在睡眠的线程。如果它是“正在运行(在断点处)”,这实际上也意味着暂停,那么它可以被杀死:
main[1] threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler cond. waiting
(java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer cond. waiting
(java.lang.Thread)0x160 Signal Dispatcher running
Group main:
(java.lang.Thread)0x1 main running (at breakpoint)
main[1] kill 0x1 new java.lang.Exception("die!")
killing thread: main
main[1] instance of java.lang.Thread(name='main', id=1) killed
OTOH,如果你试图杀死一个正在休眠的线程,那似乎是不可能的......
> threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler cond. waiting
(java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer cond. waiting
(java.lang.Thread)0x160 Signal Dispatcher running
Group main:
(java.lang.Thread)0x1bf Thread-0 sleeping
(java.lang.Thread)0x1c1 DestroyJavaVM running
> kill 0x1bf new java.lang.Exception("die!")
killing thread: Thread-0
> com.sun.tools.example.debug.expr.ParseException: Unable to create java.lang.Exception instance
Expression must evaluate to an object
> suspend
All threads suspended.
> kill 0x1bf new java.lang.Exception("die!")
killing thread: Thread-0
> com.sun.tools.example.debug.expr.ParseException: Unable to create java.lang.Exception instance
Expression must evaluate to an object
> threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler cond. waiting
(java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer cond. waiting
(java.lang.Thread)0x160 Signal Dispatcher running
Group main:
(java.lang.Thread)0x1bf Thread-0 sleeping
(java.lang.Thread)0x1c1 DestroyJavaVM running
>
另请注意,JDWP 特定线程不能以这种方式被终止(通过 JDI,jdb
也在下面使用),因为
libjdwp
会在请求时出错。鉴于您的示例中涉及的线程名称
pool-766-thread-1
,我认为它不是那些(JDWP)线程之一。