🍊下面是 Thread.sleep(0)
、Thread.sleep(1)
、Thread.yield()
和 Object.wait()
方法之间的一些区别:
Thread.sleep(0) 允许当前正在运行的线程从执行状态退出,但并不能保证立即执行其他线程。它只是将当前线程的执行时间片分配给其他线程,但并不保证立即执行。
Thread.sleep(long millis) 允许当前正在运行的线程从执行状态退出,并在指定的时间间隔后恢复执行。
Thread.yield() 允许当前正在运行的线程从执行状态退出,使当前线程从执行状态(运行状态)变为可执行态(就绪状态),但并不能保证立即执行其他线程。它只是将当前线程的执行时间片分配给其他线程,但并不保证立即执行。Thread.yield()方法并不是仅仅选择让步于同等或者更高优先级的线程。高优先级的线程也会让步与低优先级的线程。因此高优先级仅仅是线程获得的CPU时间片更多一些,相对执行到的机会更大,并不是一定先执行。
Object.wait() 允许当前正在运行的线程从执行状态退出,直到其他线程调用该对象的 notify() 或 notifyAll() 方法,或者超时为止。
这些方法都可以用于线程调度和同步。但是,它们之间有一些重要的区别,应根据具体情况选择使用。
🍊需要注意⚠️的点:
对于 Thread.sleep(0) 和 Thread.yield(),它们都是为了让出 CPU 时间片,但是它们的执行效果是不确定的。Thread.sleep(0) 可能会在下一次调度时才进行调度
Thread.sleep(0) 通常用于在轮询循环中释放 CPU 时间片。例如,假设你正在执行一个无限循环,每次循环中都需要执行一些计算。如果你在循环内部调用 Thread.sleep(0),则当前线程会在执行计算之后立即释放 CPU 时间片,以便其他线程可以运行。
在使用 Thread.sleep(0) 时,应该注意以下几点
它只是尽力让出 CPU,但并不能保证线程一定会让出 CPU。
它不能保证线程在挂起后立即恢复。
它不能保证线程在恢复后立即获得 CPU。
在大多数情况下,你不应该使用 Thread.sleep(0)。相反,应该使用其他方法,例如 Thread.yield() 或 Object.wait(),来保证线程让出 CPU。
如果你的程序只有一个线程,或者你希望当前线程能够尽可能快地执行完毕,那么使用 Thread.sleep(0) 将不会有任何作用。
你应该注意,使用 Thread.sleep(0) 来释放 CPU 时间片并不总是最佳方法。有时候,使用线程互斥或其他同步机制可能会更加有效。
关于Thread.sleep(0)、Thread.sleep(1)更多相关信息,参考此文章: