我正在尝试诊断一个生产问题。我在Mac上设置了一个小测试程序,启动10个线程(使用Executors.newCachedThreadPool(),所有线程都调用同步块中的MUTEX.wait() )
然后我执行kill -3来获取线程转储,我看到我所有的线程都显示为阻塞。难道这些不应该都在等待吗?
代码是这样的(为了简洁起见,请原谅引入的代码味道)
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();
} } }}此时,所有线程都应该处于等待状态,但实际上线程转储显示所有线程都被阻塞
发布于 2012-12-13 23:50:55
因为您的线程正在等待监视器锁进入同步的块/方法,所以它们的状态是BLOCKED。
被阻塞等待监视器锁的线程处于BLOCKED状态,而无限期等待另一个线程执行特定操作的线程处于WAITING状态。
有关BLOCKED和WAITING之间差异的更多详细信息,请参阅下面的内容
来自BLOCKED的JavaDoc
等待监视器锁定的线程的
线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块/方法,或者在调用
Object.wait之后重新进入同步块/方法。
来自WAITING的JavaDoc
处于等待状态的线程正在等待另一个线程执行特定的操作。例如,在一个对象上调用了
Object.wait()的线程正在等待另一个线程对该对象调用Object.notify()或Object.notifyAll()。已调用Thread.join()的线程正在等待指定的线程终止。
https://stackoverflow.com/questions/13863426
复制相似问题