当线程处于由ReentrantLock
锁定的关键部分时,我需要以某种方式停止线程1秒钟。
我的代码是:
public class Lock implements Runnable {
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + " is running !");
lock.wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Lock lock = new Lock();
Thread thread = new Thread(lock);
thread.start();
}
}
当我在run()方法中调用
lock.wait(1000)
时,它会抛出IllegalMonitorStateException
。如果通过
lock.lock()
方法获取了监视器,为什么会出现此异常?当我调用
super.wait(1000)
而不是lock.wait(1000)
时,也会发生同样的情况。 最佳答案
当您在锁b / c内调用lock.wait(1000)
时,您会得到异常,但您没有以正确的方式锁定对象。这是一回事。
synchronized(object) {
object.wait(1000);
}
在您已将
object
的监视器锁定的情况下,这可以正常工作。 ReentrantLock.lock()
以不同的方式工作。一切都不会丢失!您可以使用Thread.sleep()
或LockSupport.parkNanos()
将线程置于关键部分内。如果需要处理虚假唤醒,则需要循环。
long waitStart = System.nanoTime();
long waitTime = TimeUnit.SECONDS.toNanos(1);
do {
LockSupport.parkNanos(waitTime);
waitTime = waitTime - (System.nanoTime() - waitStart);
} while(waitTime > 0);
或以上的一些变化。
祝好运。
关于java - 如何在由ReentrantLock锁定的关键部分中等待指定的时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23731605/