在Java的Object类中有2个我们不怎么常用(框架中用的更多)的方法:wait()与notify()或notfiyAll(),这两个方法主要用于多线程间的协同处理,即控制线程之间的等待、通知、切换及唤醒。
首先了解下线程有哪几种状态,Java的Thread.State中定义了线程的6种状态,分别如下:
- NEW 未启动的,不会出现在dump文件中(可以通过jstack命令查看线程堆栈)
- RUNNABLE 正在JVM中执行的
- BLOCKED 被阻塞,等待获取监视器锁进入synchronized代码块或者在调用Object.wait之后重新进入synchronized代码块
- WAITING 无限期等待另一个线程执行特定动作后唤醒它,也就是调用Object.wait后会等待拥有同一个监视器锁的线程调用notify/notifyAll来进行唤醒
- TIMED_WAITING 有时限的等待另一个线程执行特定动作
- TERMINATED 已经完成了执行
从操作系统层面上来讲,一个进程从创建到消亡期间,最常见的进程状态有以下几种
新建态 : 从程序映像到进程映像的转变,还没有加入到就绪队列中
就绪态 : 进程运行已万事俱备,正等待调度执行
运行态 : 进程指令正在被执行
阻塞态 : 进程正在等待一个时间操作完成,例如I/O操作
完成态 : 进程运行结束,它的资源已经被释放,供其他活动进程使用
接下来我们分析下面的代码
public class WaitNotify {
public static void main(String[] args) {
Object lock = new Object();
// thread1
new Thread(() -> {
System.out.println("thread1 is ready");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
synchronized (lock) {
lock.notify