多线程是Java中不可避免且重要的课题。从本章开始,我们将开始学习多线程。以下内容是《JDK中新增JUC包》之前对Java多线程内容的讲解。涉及的内容包括Object类中的wait()、notify()等接口; Thread类中的接口;同步关键字。

注:JUC包指的是Java.util.concurrent包,它是由Java大师Doug Lea完成的,并在JDK1.5版本中添加到Java中。


在进入后面章节的学习之前,我们先来了解一下多线程的一些相关概念。
线程状态图

说明
线程包括以下5种状态。
1。 新状态(New):线程对象创建后,进入新状态。例如,Thread 线程 = new Thread()。
2。 就绪状态(Runnable):也称为“可执行状态”。线程对象创建后,其他线程调用该对象的start()方法来启动该线程。例如,thread.start()。处于就绪状态的线程可以随时被CPU调度执行。
3。 运行状态(Running):线程获得CPU执行权限。需要注意的是,线程只能从就绪状态进入运行状态。
4。 阻塞状态(Blocked):阻塞状态是线程由于某种原因放弃了CPU的使用权,暂时停止运行。直到线程进入就绪状态,它才有机会转入运行状态。阻塞情况有三种:
(01) 等待阻塞 -- 通过调用线程的 wait() 方法,让线程等待某项工作完成。
(02) 同步阻塞 -- 如果线程无法获取synchronized同步锁(因为该锁被其他线程占用),则会进入同步阻塞状态。
(03) 其他阻塞 -- 当调用线程的 sleep() 或 join() 或发出 I/O 请求时,线程将进入阻塞状态。当sleep()状态超时、join()等待线程终止或超时,或者I/O处理完成时,线程返回到就绪状态。
5。 死亡状态(Dead):当线程执行完毕或者因异常退出run()方法时,线程结束生命周期。

这五个状态涉及的内容包括Object类、Thread和synchronized关键字。我们将在后面的章节中一一研究这些内容。
对象类定义了wait()、notify()、notifyAll()等休眠/唤醒函数。
线程类定义了一系列线程操作函数。比如sleep()睡眠函数、interrupt()中断函数、getName()获取线程名等。
synchronized是关键字;它分为同步代码块和同步方法。 Synchronized的作用是让线程获得对象的同步锁。
后面详细介绍wait()、notify()等方法时,我们会分析为什么“wait()、notify()等方法应该定义在Object类而不是Thread类中”。