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

时间:2012-12-13 15:48:02

标签: java multithreading concurrency

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

然后我做了一个kill -3来获得一个线程转储,我看到我的所有线程都显示为BLOCKED。 这些都不应该等待吗?

代码是这样的,(原谅代码气味为了简洁而引入)

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();
}  }   }}

此时所有线程都应处于WAITING状态,但实际上线程转储显示所有线程都是BLOCKED

1 个答案:

答案 0 :(得分:4)

由于您的线程正在等待监视器锁定以输入同步块/方法,因此它们的状态为BLOCKED

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

有关BLOCKEDWAITING之间差异的详细信息,请参见下文:

来自BLOCKED的JavaDoc:

  

线程的线程状态被阻塞等待监视器锁定。一个帖子   处于阻塞状态正在等待监视器锁定进入   同步块/方法或之后重新输入同步块/方法   致电Object.wait

来自WAITING的JavaDoc:

  

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