在Java中,wait()
和yield()
都是Object
类的方法,主要用于多线程编程中的线程同步。它们的主要区别在于它们的用途和行为。
-
wait()
:- 当一个线程调用
wait()
方法时,它会释放该线程所持有的对象锁(如果已经持有),然后进入等待状态,直到其他线程调用同一个对象的notify()
或notifyAll()
方法唤醒它。 wait()
方法必须在同步代码块或同步方法中调用,否则会抛出IllegalMonitorStateException
异常。wait()
方法通常用于线程间的通信,例如生产者-消费者问题。
- 当一个线程调用
-
yield()
:- 当一个线程调用
yield()
方法时,它会暂时让出CPU资源,使其他具有相同优先级的线程有机会执行。但是,这并不意味着当前线程会进入阻塞状态。 yield()
方法不会释放对象锁,也不会导致线程进入等待状态。它只是让当前线程暂时停止执行,以便其他线程可以运行。yield()
方法的行为取决于操作系统的线程调度策略,因此不能保证一定会使当前线程立即停止执行。yield()
方法通常用于提高程序的并发性能,但并不能保证线程间的公平性。
- 当一个线程调用
总结一下,wait()
和yield()
的主要区别在于:
wait()
会导致线程进入等待状态并释放对象锁,而yield()
只是让当前线程暂时停止执行,不会释放对象锁。wait()
用于线程间的通信,例如生产者-消费者问题,而yield()
用于提高程序的并发性能。