sleep() 是Thread类中的一个静态方法,当调用sleep方法后,调用线程会暂时让出cup的执行权,但不会释放锁资源。到了指定时间睡眠之后,线程处于就绪状态,参与cup调度,获取cup执行权继续执行。
点击查看代码
package cn.tencent.data.ext.service.handler.common;
import java.util.concurrent.locks.ReentrantLock;
public class test {
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");
System.out.println(Thread.currentThread().getName()+"begin sleep");
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+"over sleep");
//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");
System.out.println(Thread.currentThread().getName()+"begin sleep");
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+"over sleep");
// 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()方法不会释放锁资源