java.lang.IllegalMonitorStateException是我通过一个讨厌的堆栈跟踪得到的。
final Condition[] threads = new Condition[maxThreads];
myclass()
{
for (int i =0; i<maxThreads; i++)
threads[i] = mutex.newCondition();
}
public void test()
{
mutex.lock();
int id = threadCount;
threadCount++;
mutex.unlock();
threads[id].await();
}
当我用多个线程调用test时,它会生成上面的错误。这是由排队等候引起的。我不太愿意使用synchronized,因为我希望所有的线程都能等待。
发布于 2011-04-05 01:11:12
你只能在持有互斥锁的同时调用await。所以代码应该是:
mutex.lock();
try {
// do your stuff
threads[id].await();
} finally {
mutex.unlock();
}
我添加try / finally的原因是为了确保即使抛出异常,锁也会被释放。
可能还值得注意的是,您只能在保持互斥锁的同时,根据自己的条件调用signal
。即使在调用await之前获得了锁,您也能够获得互斥锁,因为调用await
会导致等待线程在等待时释放锁。
发布于 2011-04-05 01:13:42
在实践中,您应该这样await
:
mutex.lock();
try
{
threads[threadCount++].await();
}
finally
{
mutex.unlock();
}
https://stackoverflow.com/questions/5546057
复制相似问题