Bootstrap

Thread的sleep()方法

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并发编程之美》

;