1

我正在尝试诊断生产问题。我在 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 状态,但实际上线程转储显示所有线程都已阻塞

4

1 回答 1

4

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

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

BLOCKED有关和之间区别的更多详细信息,请参见下文WAITING

来自BLOCKED的JavaDoc :

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

来自WAITING的 JavaDoc :

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

于 2012-12-13T15:50:55.307 回答