参考答案:
Thread.sleep()
和 Thread.yield()
都是 Java 中用于控制线程执行的两种方法,但它们的行为和用途有所不同。
Thread.sleep(long millis)
Thread.sleep()
方法使当前正在执行的线程 暂停指定的时间,不会占用 CPU 资源。它是静态方法,接受一个参数 millis
(表示暂停的时间,以毫秒为单位)。可以通过 sleep()
方法来控制线程的执行节奏。
作用:使当前线程进入 休眠状态,暂停执行指定的时间(单位是毫秒)。
不会释放锁:如果当前线程持有某个锁(如同步块中的锁),它在 sleep()
期间仍然保持对该锁的持有。
不能被中断:sleep()
方法可能会抛出 InterruptedException
异常,因此通常需要进行异常处理。
例子:
1try { 2 Thread.sleep(1000); // 当前线程暂停执行1秒 3} catch (InterruptedException e) { 4 e.printStackTrace(); 5}
用途:当我们想让当前线程暂停一段时间后再继续执行时,使用 sleep()
。
Thread.yield()
Thread.yield()
方法提示当前正在执行的线程 放弃 CPU 使用权,使得其他线程有机会执行,但并不保证当前线程会立即停止。它是一个 建议性 方法,告诉线程调度器当前线程愿意让出 CPU 给其他线程,优先级相同的情况下,其他线程有可能被调度执行。
作用:使当前线程 自愿让出 CPU 时间片,并不意味着线程会暂停,调度器可能会选择该线程继续执行,或者调度其他同优先级的线程。
释放锁:yield()
不会释放锁,持有的锁仍然会被当前线程保留。
无法保证立即切换:yield()
是一种提示,操作系统的线程调度器可以选择不立即让当前线程让出 CPU,因此线程可能会继续执行。
例子:
1Thread.yield(); // 当前线程让出 CPU
用途:yield()
主要用于帮助多线程程序达到某种调度上的公平性,或者在多线程环境下给其他线程执行的机会,尤其是在没有同步机制时。
sleep()
和 yield()
的区别:特性 | sleep() | yield() |
---|---|---|
线程状态 | 使线程进入 休眠状态 | 使线程进入 就绪状态,但不暂停 |
是否释放 CPU | 释放 CPU 资源,暂停当前线程 | 让出 CPU 资源,但线程可能继续执行 |
是否让出锁 | 不会释放锁 | 不会释放锁 |
是否可被中断 | 可以被中断 | 不可被中断 |
调度器行为 | 调度器按照 sleep 期间指定的时间休眠 | 仅是提示,不保证线程会立即停止 |
典型用途 | 用于让线程暂停执行一定的时间 | 用于让出 CPU,给予其他线程执行的机会 |
最近更新时间:2024-12-09