9、线程的 通信
线程通信涉及到的 3个方法:
- wait(): 一旦执行此方法,当前线程就进入阻塞状态,并释放 同步监视器。
- notify(): 一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait, 就唤醒优先级高的
- 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 交替打印
执行程序 ,查看控制台:(可以看到,两个线程 是交替执行的)