sleep()方法与yield()方法的区别

本文探讨了Java中sleep()与yield()方法的关键差异:1)sleep()不考虑线程优先级,yield()只让相同或更高优先级的线程运行;2)sleep()使线程进入阻塞状态,而yield()仅使线程重回可执行状态;3)sleep()声明抛出InterruptedException,yield()无异常声明;4)sleep()具有更好的跨平台性。

1)sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给优先级低的线程以运行的机会,而yield()方法只会给相同优先级或者更高优先级的线程以运行机会。
2)线程执行sleep()方法后会转入阻塞状态,所以,执行sleep()方法的线程在指定的时间内肯定不会被执行,而yield()方法只是使当前线程重新回到可执行状态,所以执行yield()方法的线程有可能在进入到可执行状态后马上又被执行。
3)sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常。
4)sleep()方法比yield()方法(跟操作系统)具有更好的可移植性。

线程的`sleep`、`join`、`yield`方法存在多方面的区别: ### 功能用途 - `sleep`方法是让当前线程暂停执行一段指定的时间,常用于模拟耗时操作、控制线程执行的时间间隔等,时间到了自动唤醒[^2]。 ```java public class SleepExample { public static void main(String[] args) { Thread thread = new Thread(() -> { try { System.out.println("线程开始休眠"); Thread.sleep(2000); System.out.println("线程休眠结束"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread.start(); } } ``` - `join`方法是等待调用该方法线程终止,可以带超时参数,用于线程之间的同步,确保一个线程在另一个线程执行完成后再继续执行[^2]。 ```java public class JoinExample { public static void main(String[] args) { Thread thread1 = new Thread(() -> { try { Thread.sleep(2000); System.out.println("线程1执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread thread2 = new Thread(() -> { try { thread1.join(); System.out.println("线程2在等待线程1执行完毕后开始执行"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread1.start(); thread2.start(); } } ``` - `yield`方法是提示调度器当前线程愿意让出CPU时间片,常用于让同优先级或更高优先级的线程有执行的机会,不过只是一种建议,不一定会生效[^1][^2]。 ```java public class YieldExample { public static void main(String[] args) { Thread thread1 = new Thread(() -> { for (int i = 0; i < 5; i++) { System.out.println("线程1执行: " + i); Thread.yield(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 5; i++) { System.out.println("线程2执行: " + i); Thread.yield(); } }); thread1.start(); thread2.start(); } } ``` ### 线程状态影响 - `sleep`方法会让线程进入阻塞状态(`TIMED_WAITING`),在指定时间内不会参CPU调度[^3]。 - `join`方法会使调用线程进入等待状态(`WAITING`或`TIMED_WAITING`),直到被调用的线程执行完毕或超时[^2]。 - `yield`方法不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,执行`yield()`的线程有可能在进入到可执行状态后马上又被执行[^1]。 ### 锁的处理 - `sleep`、`yield`、`join`都不会释放锁,线程在执行这些方法时仍然持有已经获取的锁[^4]。 ### 可中断性 - `sleep``join`都可以被打断,打断之后需要自己处理相关业务逻辑,例如捕获`InterruptedException`异常[^4]。 - `yield`方法不会被中断,因为它只是让出CPU时间片,线程仍处于就绪状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值