AI智能
改变未来

多线程中的wait、notify、notifyAll方法


多线程中的wait、notify、notifyAll方法

wait、notify、notifyAll是三个定义在Object类里的方法,可以用来控制线程的状态。

1.线程的状态

线程的六种状态:

  • NEW 尚未启动的线程处于此状态。
  • RUNNABLE 在Java虚拟机中执行的线程处于此状态。
  • BLOCKED 被阻塞等待监视器锁定的线程处于此状态。
  • WAITING 无限期等待另一个线程执行特定操作的线程处于此状态。
  • TIMED_WAITING 正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
  • TERMINATED 已退出的线程处于此状态。


线程在给定时间点只能处于一种状态。

2.wait、notify、notifyAll方法

(1)wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用。
(2)如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。当前线程从运行变为阻塞,释放锁的资源。
(3)其他线程调用notify、notifyAll方法就会通知某个或所有正在等待的这个对象控制权的线程可以继续运行,但不是立刻运行,因为notify和notifyAll不会把对象控制权交出去。也就是说,在当前线程放弃对该对象的锁定之前,唤醒的线程将无法继续。

3.notify与notifyAll方法的区别

(1)notify:唤醒一个正在此对象监视器上等待的线程。 如果多个线程正在等待此对象,则选择其中一个线程被唤醒。唤醒的线程将以通常的方式与可能正在竞争同步此对象的任何其他线程竞争。
(2)notifyAll:唤醒在此对象监视器上等待的所有线程;

4.wait与sleep的区别

(1)sleep方法属于Thread类中的,而wait方法属于Object类中;
(2)sleep方法是使当前执行的线程进入暂时性的睡眠状态,wait可以一直睡眠直到有其他线程唤醒它。调用sleep方法的线程不会失去任何监视器的所有权。即不会释放锁资源,不会把对象的控制权交出去。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 多线程中的wait、notify、notifyAll方法