wait()
方法是Java中的一个同步原语,用于让当前线程等待,直到其他线程调用同一个对象的notify()
或notifyAll()
方法。在调用wait()
方法之前,线程必须拥有该对象的监视器(monitor),否则会抛出IllegalMonitorStateException
异常。
线程调度的过程如下:
当一个线程调用某个对象的wait()
方法时,它会释放该对象的监视器并进入等待状态。此时,线程调度器会将此线程置于等待池中。
在等待池中的线程不会立即执行,而是等待操作系统将其重新调度到可运行池。线程调度器会根据操作系统的线程调度策略和当前系统的负载情况来决定何时将等待池中的线程重新调度到可运行池。
当另一个线程调用相同对象的notify()
或notifyAll()
方法时,等待池中的所有线程会被唤醒。这些线程会重新尝试获取对象的监视器。如果成功获取到监视器,它们将离开等待池并进入可运行池。
线程调度器会从可运行池中选择一个线程来执行。这个线程将继续执行wait()
方法之后的代码。
需要注意的是,wait()
、notify()
和notifyAll()
方法必须在同步代码块或同步方法中使用,即在调用这些方法的代码前加上synchronized
关键字。这样可以确保在同一时刻只有一个线程能够访问这些方法,从而避免竞争条件和死锁。