首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程转储显示错误的线程状态

线程转储显示错误的线程状态
EN

Stack Overflow用户
提问于 2012-12-13 23:48:02
回答 1查看 201关注 0票数 1

我正在尝试诊断一个生产问题。我在Mac上设置了一个小测试程序,启动10个线程(使用Executors.newCachedThreadPool(),所有线程都调用同步块中的MUTEX.wait() )

然后我执行kill -3来获取线程转储,我看到我所有的线程都显示为阻塞。难道这些不应该都在等待吗?

代码是这样的(为了简洁起见,请原谅引入的代码味道)

代码语言:javascript
复制
ExecutorService executor = Executors.newCachedThreadPool();
final Object MUTEX = new Object();
for(int i = 0; i < 10; i++) {
   executor.execute(new Runnable() {
      public void run() {
        synchronized(MUTEX) {
         MUTEX.wait();
}  }   }}

此时,所有线程都应该处于等待状态,但实际上线程转储显示所有线程都被阻塞

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-13 23:50:55

因为您的线程正在等待监视器锁进入同步的块/方法,所以它们的状态是BLOCKED

被阻塞等待监视器锁的线程处于BLOCKED状态,而无限期等待另一个线程执行特定操作的线程处于WAITING状态。

有关BLOCKEDWAITING之间差异的更多详细信息,请参阅下面的内容

来自BLOCKED的JavaDoc

等待监视器锁定的线程的

线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块/方法,或者在调用Object.wait之后重新进入同步块/方法。

来自WAITING的JavaDoc

处于等待状态的线程正在等待另一个线程执行特定的操作。例如,在一个对象上调用了Object.wait()的线程正在等待另一个线程对该对象调用Object.notify()Object.notifyAll()。已调用Thread.join()的线程正在等待指定的线程终止。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13863426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档