每一个任务就是一个进程,每个进程内部至少有一个线程在运行中。线程是程序执行的一个路径,每一个线程都有自己的局部变量表,程序技术器,以及各自的生命周期。
1.创建一个线程,并且重写它的run方法,将行为方法交给它执行。
2.启动新的线程,只有调用了Thread的start方法,才代表派生了一个新的线程,否则Thread和其他普通的Java对象没有什么区别,start方法是一个立即返回方法,并不会让程序陷入阻塞
使用jconsole查看正在运行的线程:(C:\Program Files\Java\jdk1.8.0_73\bin\jconsole)
线程的生命周期:new,runnable,running ,blocked,terminated
线程new状态:
使用关键字new创建一个thread对象时,此时它并不处于执行状态,因为没有调用start方法启动该线程,线程状态为new,它只是thread对象的状态,new状态通过start方法进入runnable状态。
线程runnable状态:线程对象进入runnable状态必须调用start方法启动该线程,但不一定是立即执行,线程的执行与否和进程一样都要听CPU的调度,这个中间状态就是runnable,即几倍执行的资格。由于存在running状态,所以不会直接进入blocked和terminater状态,即使线程的执行逻辑调用wait,sleep或其他blockde的IO操作,也必须先获得CPU的状态执行权才可以。
线程的running状态:
一旦CPU通过轮训或其他方式从任务可执行队列中选中了线程,那么此时它才能真正的执行自己的逻辑代码。一个正在running状态的线程事实上也是runnable的,但是反过来不成立。
running状态中,线程的状态切换:
1.直接进入terminated状态,比如调用jdk的stop方法,或者判断某个逻辑标识
2.进入某个阻塞的IO操作,比如因网络数据的读写而进入了blocked状态。
3.获取某个锁资源,从而加入到该锁的阻塞队列中而进入了blocked状态。
4.由于CPU的调度器轮询使该线程放弃执行,进入runnable状态。
5.线程主动调用yield方法,放弃CPU执行权,进入runnable状态。
线程的blocked状态:
线程在blocked状态中可以切换的状态:
1.直接进入terminated状态,比如调用jdk的stop方法或者意外死亡(JVM Crash)。
2.线程阻塞的操作结束,比如读取了想要的数据字节进入到runnable状态。
3.线程完成了指定时间的休眠,进入到了runnable状态。
4.wait中的线程被其他线程notify/notifyAll唤醒,进入runnable状态。
5.线程获取到了某个锁资源,进入runnable状态。
6.线程在阻塞过程中被打断,比如其他线程调用了interrupt方法,进入runnable状态。
线程的terminated状态:terminated是线程的最终状态,此状态中线程将不会切换到其他任何状态,线程的整个生命周期都结束了。
进入terminated状态的场景:
1.线程运行正常结束,结束生命周期
2.线程运行出错意外结束
3.JVM Crash导致所有的线程都结束。
资料参考:
《Java高并发程序设计》,《Java高并发编程详解2018》,《Java多线程编程实战指南-核心篇》