问答题1038/1053线程的 sleep()方法和 yield()方法有什么区别?

难度:
2021-11-02 创建

参考答案:

Thread.sleep()Thread.yield() 都是 Java 中用于控制线程执行的两种方法,但它们的行为和用途有所不同。

1. 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()

2. 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