一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
认识
线程是什么?
线程是程序执行的最小单元,依托于进程存在。
一个进程中可以包含多个线程,多线程也可以共享同一块内存空间和系统资源,因此线程之间的切换相比于进程之间的切换更加节省资源、更加轻量化。
线程的状态
-
NEW,新建状态:线程被创建出来,但尚未启动时的线程状态
-
RUNNABLE,就绪状态:表示线程可以运行的状态,它可能正在运行,或者是在排队等待操作系统分配 CPU 资源;
-
BLOCKED,阻塞等待锁的线程状态:表示处于阻塞状态的线程,正在等待锁释放,比如等待执行 synchronized 代码块或者使用 synchronized 标记的方法,但此时已经被其他线程执行,所以处于阻塞等待。
-
WAITING,等待状态:一个线程正在等待另一个线程执行某个特定的动作,这个线程就处于等待状态。 比如一个线程调用了 Object.wait() ,那它在等待另一个线程调用 Object.notify() 或 Object.notifyAll() 方法时所处的状态,称之为等待状态。
-
TIMED_WAITING,超时等待状态:当进行等待状态时,会设置一个超时时间,当等待时长超过规定的时间后,线程所处的状态就称为超时等待状态。比如 Object.wait(long timeout) 和 Thread.join(long timeout) 等方法,就会让线程有可能进入此状态。
-
TERMINATED,终止状态:表示线程已经执行完成。
线程状态的枚举源代码:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED
}
线程的工作模式
- 首先创建线程,此时线程处于NEW状态。
- 指定线程需要执行的业务方法,此时线程处于RUNNABLE状态
- 线程执行过程中,如果遇到有同步代码块,并且其他线程先一步执行,则当前线程则会进入BLOCKED状态。待其他线程执行完成同步代码块之后,当前线程会继续等待。
- 如果线程中代码有调用Object.wait()方法或者Thread.join()方法时,线程会进入WAITING状态,并且当有设置超时时间时,则线程会进入TIMED_WAITING等待状态。直到有其他线程执行了notify() 或 notifyAll() 方法,当前线程才会被唤醒,继续执行代码。
- 最后线程方法执行完成,线程也就变成了TERMINATED状态。