我正在尝试诊断生产问题。我在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
答案 0 :(得分:4)
由于您的线程正在等待监视器锁定以输入同步块/方法,因此它们的状态为BLOCKED
。
阻塞等待监视器锁定的线程处于BLOCKED
状态,并且无限期等待另一个线程执行特定操作的线程处于WAITING
状态。
有关BLOCKED
和WAITING
之间差异的详细信息,请参见下文:
来自BLOCKED的JavaDoc:
线程的线程状态被阻塞等待监视器锁定。一个帖子 处于阻塞状态正在等待监视器锁定进入 同步块/方法或之后重新输入同步块/方法 致电
Object.wait
。
来自WAITING的JavaDoc:
处于等待状态的线程正在等待另一个线程执行 一个特定的行动。例如,已调用的线程 对象上的
Object.wait()
正在等待另一个线程调用 该对象上的Object.notify()
或Object.notifyAll()
。一个线程 已调用Thread.join()
正在等待指定的线程 终止。