当线程处于由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/

10-12 00:44