我刚刚生成了运行以下命令的Java应用程序的线程转储:
> ./jstack -F 4697 >>/tmp/thread_dump_1529.log
经过一些检查,我意识到有74个处于BLOCKED状态的线程,它们都具有相同的堆栈跟踪:
在以下代码中,您可以在这些线程陷入sun.misc.Unsafe.park(boolean, long)
之前看到它们的堆栈:
threadId:Thread 5212 - state:BLOCKED
stackTrace:
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information
may be imprecise)
- java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14,
line=175 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await()
@bci=42, line=2039 (Compiled frame)
- java.util.concurrent.LinkedBlockingQueue.take() @bci=29, line=442 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1134 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
- java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
此外,我发现sun.misc.Unsafe.park(boolean, long)
将线程置于其等待状态。我试图杀死4697进程并重新启动,但是这些被阻塞的线程仍然存在。
这些被阻塞的线程是什么?