更新时间:2024-04-15 来源:黑马程序员 浏览量:
在Java中,sleep()和wait()方法都可以用于线程的控制和调度,但它们有着不同的作用和使用场景。
sleep()方法是Thread类的静态方法,用于暂停当前正在执行的线程一段指定的时间,让出CPU资源给其他线程执行。其签名如下:
public static void sleep(long millis) throws InterruptedException
(1)参数millis表示要睡眠的时间长度,以毫秒为单位。
(2)sleep()方法不会释放对象的锁。
特点:
(1)sleep()方法是静态方法,可以通过Thread.sleep()直接调用。
(2)sleep()方法是线程级别的,即调用sleep()的线程会进入睡眠状态,不会释放锁,其他线程仍然无法访问同步方法或同步块。
(3)sleep()方法可能会抛出InterruptedException异常,需要处理中断。
适用场景:
(1)用于暂时停止当前线程的执行,例如在某些情况下需要延迟执行一段时间后再继续执行。
wait()方法是Object类的方法,用于在某个对象上等待,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它,或者等待超时。其签名如下:
public final void wait() throws InterruptedException
(1)调用wait()方法的线程必须拥有该对象的监视器(即在同步方法或同步块中调用)。
(2)wait()方法会释放对象的锁。
特点:
(1)wait()方法必须在同步方法或同步块中调用,否则会抛出IllegalMonitorStateException异常。
(2)wait()方法会使当前线程进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法,或者等待超时。
(3)wait()方法会释放对象的锁,其他线程可以访问该对象的同步方法或同步块。
(4)wait()方法可能会抛出InterruptedException异常,需要处理中断。
适用场景:
(1)用于线程间的协调,一个线程等待另一个线程的通知。
(2)常与notify()和notifyAll()方法一起使用,实现线程间的同步和通信。
总结:
(1)sleep()方法用于线程睡眠,暂时停止当前线程的执行,不释放锁。
(2)wait()方法用于线程等待,使当前线程进入等待状态,释放对象的锁。
这两种方法在功能上有所重叠,但主要区别在于它们的使用场景和释放锁的行为。