线程:是操作系统调度的最小单元,也叫轻量级进程。它被包含在进程之中,是进程中的实际运作单位。同一进程可以创建多个线程,每个进程都有自己独立的一块内存空间。并且能够访问共享的内存变量。
Java线程的状态(区分注意的是操作系统线程的状态还是java的线程状态,两者不能完全划等号):
- 新建 New 创建后尚未启动的线程处于此初始状态 一个线程start方法只能执行一次 再次调用会抛IllegalThreadStateException <非法线程状态>
- 运行 Runable 此状态包括了操作系统线程状态中的 Running<获取到CPU并在执行>和Ready<准备在CPU执行>两种状态。也就是处于此状态的线程有可能正在执行,也有可能正在等待CPU为它分配执行时间但统称为java线程的Runable状态。
- 当一个线程对象的start方法被调用时
- 正在运行的线程CPU时间片耗尽
- 正处于阻塞状态的线程满足了运行条件
- 获取到CPU时间片,正在执行
- 处于Runable状态下的线程正在 Java 虚拟机中执行,但它可能正在等待来自于操作系统的其它资源,比如处理器。
- 无限期等待 Waiting 处于这种状态的线程不会被分配CPU执行时间,它们要等待其他线程显示地唤醒。以下方法会让线程陷入无限期的等待状态:
- 没有设置Timeout参数的Object.wait()
- 没有设置Timeout参数的Thread.join()
- LockSupport.park方法
- 限期等待 Timed Waiting 处于此状态的线程也不会被分配CPU执行时间,不过可以不等待其他线程显示地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态:
- Thread.sleep() 方法,没有任何同步语义。所以线程不会失去任何monitor的所有权。也就不会释放锁。
- 设置了Timeout参数的Object.wait()方法
- 设置了Timeout参数的Thread.join()方法
- LockSupport.parkNanos()方法
- LockSupport.parkUntil()方法
- 阻塞状态 Blocked “阻塞状态”与“等待状态”的区别是: “阻塞状态”是在等待获取到一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生,而“等待状态”则是等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域的时候,线程将进入这种状态。
- 终结状态 Terminated当线程run方法执行完或者遇到异常退出时线程死亡,线程的生命周期便宣告结束。
知识点:
多线程的三个问题:原子性,有序性,可见性。导致可见性的原因是缓存,导致有序性的原因是编译优化