【发布时间】:2015-02-20 14:44:38
【问题描述】:
我已经提取了我的容器进程的 JStack 并让线程在那里运行,并使用以下按 Thread.state 分组的分布:
count thread state
67 RUNNABLE
1 TIMED_WAITING (on object monitor)
8 TIMED_WAITING (parking)
4 TIMED_WAITING (sleeping)
3 WAITING (on object monitor)
17 WAITING (parking)
对于可运行的线程,我有以下描述:
"http-bio-8080-exec-55" daemon prio=10 tid=0x000000002cbab300 nid=0x642b in Object.wait() [0x00002ab37ad11000]
java.lang.Thread.State: RUNNABLE
at com.mysema.query.jpa.impl.JPAQuery.<init>(JPAQuery.java:44)
at net.mbppcb.cube.repository.TransactionDaoImpl.findByBusinessId(TransactionDaoImpl.java:73)
at sun.reflect.GeneratedMethodAccessor76.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
...
如上所示,处于 RUNNABLE 状态的线程数随着时间的推移而增加,并且似乎处于挂起状态。如果他们假设被阻止,他们不应该处于 BLOCKED 状态吗?或者他们应该处于 WAITING 状态?有 RUNNABLE 线程但在 Object.wait() 中不是很奇怪吗?
更新 1
我可以在文档中看到:
处于可运行状态的线程正在 Java 虚拟中执行 机器,但它可能正在等待来自操作的其他资源 处理器等系统。
我怎样才能知道线程在等待什么?
【问题讨论】:
-
Object.wait()中的线程应该有Thread.State.WAITING,而不是BLOCKED。也就是说,我不知道为什么会是RUNNABLE。 -
你是对的,我的错。但这种奇怪的状态会不会与我的 JVM 版本和操作系统版本有关?可能是两者结合的奇怪错误?
-
Object.wait() 中线程的其余堆栈跟踪是什么?
-
@DennisW 线程在调用
o.wait()的事实并不像你想象的那样紧密耦合到它的状态。当事件发出信号时,线程的状态将从WAITING更改为RUNNABLE,但线程仍将处于o.wait()调用中。然后它会经历其他的状态变化:它最终会运行,然后它可能会在尝试重新获取锁时再次被阻塞,然后它会第二次变为RUNNABLE,最后它会得到再次运行,它将从调用中返回。 -
@KristofferE:刚刚添加了有关堆栈跟踪的其他信息
标签: java multithreading