这里提到的 sleep()、wait()、join() 和 yield() 是多线程编程中常用的几个方法,它们之间有一些区别:
1. sleep():
- sleep() 方法是 Thread 类的静态方法,用于让当前线程暂停执行指定的时间。
- 调用 sleep() 方法时,当前线程会暂停执行,但不会释放对象锁。
- sleep() 只会暂停当前线程的执行,不会影响其他线程的执行。在指定时间过后,线程会重新进入就绪状态,并尝试再次获取CPU执行权。
- 可以用来模拟等待或阻塞的情况。
2. wait():
- wait() 是 Object 类中的实例方法,用于让当前线程释放对象锁,并进入等待状态。
- 当调用 wait() 方法时,当前线程会暂停并释放对象锁,直到其他线程调用 notify() 或 notifyAll() 方法来唤醒它,或者等待的时间到达。
- wait() 方法必须在同步块或同步方法中调用,否则会抛出 IllegalMonitorStateException 异常。
- 可以用来实现线程间的协作和同步。
3. join():
- join() 方法是 Thread 类的实例方法,用于让一个线程等待另一个线程执行完毕。
- 当一个线程调用另一个线程的 join() 方法时,当前线程会被阻塞,直到另一个线程执行完毕。
- join() 可以用来实现线程的顺序执行。
4. yield():
- yield() 方法是 Thread 类的静态方法,用于提示调度器当前线程愿意放弃当前的 CPU 执行权。
- 调用 yield() 方法时,当前线程会让出 CPU 执行权,让其他具有相同优先级的线程有机会执行。
- yield() 方法没有释放对象锁,只是提示调度器让出 CPU 执行权。
总结:
- sleep() 是让当前线程暂停执行一段时间,不释放对象锁;
- wait() 是让当前线程释放对象锁,并进入等待状态;
- join() 是让一个线程等待另一个线程执行完毕;
- yield() 是提示调度器放弃当前的 CPU 执行权,让其他线程执行。