首先,基本概念部分
1、线程:比进程更小的执行单元,利用多线程,可以提高CPU利用率。
2、线程状态:
#1:新建状态:此时由操作系统新建了一个线程,但是这个线程并没有正式开始执行
#2:Runable可运行状态(经虚拟机运行后没问题,即为可运行状态):在虚拟机中执行,但是并没有正式在自己的机器中执行,相当于正式表演之前的彩排。
#3:Running正在执行状态:一个线程正在执行时的状态。
#4:Blocked阻塞状态:在一个线程的执行过程中,因为某些原因,这个线程不能顺利执行,暂时被打断。打断后做了两件事,第一件,转入下一个线程的执行
;第二件,等待某个条件或者某个动作将其唤醒
3、相关动作:
#1:start():将线程由新建状态变为Runable状态。
#2:join()、sleep()、wait():当处于running状态的线程由于某些原因不能执行时,调用这三个函数。使其转换到block阻塞状态。
#3:sleep()结束、join中断、I/O完成等动作使线程由block状态变为Runable状态
#4、虚拟机调度:为Runable状态的线程赋予CPU,使得其可以正式执行。
#5、yield():将Running状态的线程变为Runnable状态。
#6:run结束、异常推出:线程死亡,释放掉它所具有的资源。
#7:notify/notifyAll::处于block状态的线程的内部切换。
3、相关数据结构:
#1、等待池:正在执行的线程被阻塞后,由Running态进入block阻塞态后首先进入这个等待池,等待池中的线程是解了锁的阻塞态,不能直接转到Runable状态。
#2、阻塞池:等待池中的线程经过notify或者notifyAll函数后,进入加锁状态,成为了加锁态的阻塞态,此时可以转为Runable态。
4、总结:Runing态可以转为除了新建状态的任意状态。而只有Runable态可以转为Runing态
5、只有使用了synchronized关键字的线程能实现阻塞(Blocked)状态下的转换