sleep() 是Thread类中的一个静态方法,当调用sleep方法后,调用线程会暂时让出cup的执行权,但不会释放锁资源。到了指定时间睡眠之后,线程处于就绪状态,参与cup调度,获取cup执行权继续执行。
package org.binfa.concurrentprogramming.sleep;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;
/**
* sleep() 是Thread类中的一个静态方法,当调用sleep方法后,调用线程会暂时让出cup的执行权,
* 但不会释放锁资源。到了指定时间睡眠之后,线程处于就绪状态,参与cup调度,获取cup执行权继续执行
* @Author: jun
* @Date: 2022/7/31 9:30
*/
@Slf4j
public class SleepTest {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock(false);
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
log.info(Thread.currentThread().getName()+"begin sleep");
Thread.sleep(5000);
log.info(Thread.currentThread().getName()+"over sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}, "ThreadA");
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
log.info(Thread.currentThread().getName()+"begin sleep");
Thread.sleep(5000);
log.info(Thread.currentThread().getName()+"over sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}, "ThreadB");
threadA.start();
threadB.start();
}
}
多次运行结果:
ThreadAbegin sleep
ThreadAover sleep
ThreadBbegin sleep
ThreadBover sleep
总结:通过运行结果可以发下,只有等待线程A完全释放了锁,线程B才能获取到锁,这里也证明了sleep()方法不会释放锁资源
参考文献:《java并发编程之美》