9、线程的 通信


线程通信涉及到的 3个方法:

  1. wait():         一旦执行此方法,当前线程就进入阻塞状态,并释放 同步监视器。
  2. notify():       一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait, 就唤醒优先级高的
  3. notifyALL():   一旦执行此方法,就会唤醒 所有 被 wait的线程。

说明:
  1. wait(),notify(),  notifyAlL() 三个方法必须使用在同步代码块或同步方法中。
  2. wait(),notify(),  notifyALL()  三个方法的调用者 必须是同步代码块或同步方法中的同步监视器  ,否则会出现IllegaLMonitorStateException异常
  3. wait(),notify(),  notifyALL()    三个方法是定义在 java. lang. 0bject类中。

面试题: sleep()和wait()的异同?

1. 相同点:  一旦执行方法,都可以使得当前的线程进入阻塞状态。
2. 不同点: 1、两个方法声明的位置不同: Thread类中声明sleep() ,object类 中声明wait()
         2、调用的要求不同: sleep() 可以在任何需要的场景下调用。wait()必须使用 在 同步代码块 (方法) 中
         3、关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep不会释放锁,wait会释放

线程通信的例子: 使用两个线程打印 1-100。线程A,线程B 交替打印

 执行程序 ,查看控制台:(可以看到,两个线程 是交替执行的)