sleep()--线程休眠
上一篇:join()—等待线程执行终止
sleep()是Thread类下的一个静态方法
另外一个sleep(long time,int nanos)也是静态的,,最终还是调用了sleep()方法
当一个执行中的线程调用了Thread的sleep()方法后,调用线程会暂时让出指定时间的执行权,也就是在这期间,该线程不参与cpu的调度 但是该线程所拥有的监视器资源比如锁,不会让出,也就是线程在sleep()期间,一直占有锁,不会释放。
在sleep()时间到了之后,线程正常返回,处于就绪状态然后参与cpu的调度,获取到cpu资源后继续执行。
代码示例:
public class SleepTest {
private Object object = new Object();
public SleepTest() {
Thread thread1 = new Thread(() -> {
synchronized (object){
try {
System.out.println("线程1 获取到对象锁");
System.out.println("线程1 开始休眠");
Thread.sleep(3000);
System.out.println("线程1 休眠结束");
System.out.println("线程1 执行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (object){
try {
System.out.println("线程2 获取到对象锁");
System.out.println("线程2 开始休眠");
Thread.sleep(3000);
System.out.println("线程2 休眠结束");
System.out.println("线程2 执行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread1.start();
thread2.start();
}
public static void main(String[] args) {
new SleepTest();
}
}
执行结果:
在线程休眠期间,另外一个线程没有执行,,说明在线程休眠期间,不会释放object的锁,因此其他线程无法获取到则不能执行。
sleep()也是线程阻塞的一种方式;
与wait()的差别:
sleep(long time) | wait(long time) |
---|---|
Thread类下的一个静态方法 | Object类的方法 |
使线程休眠期间不释放锁 | 阻塞期间,释放锁 |
与wait()的相同点:
1、调用期间都释放cpu调度权,即不参与线程调度器的调度
2、阻塞线程
3、阻塞时间到了之后,正常返回,处于就绪状态
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南