补充2:线程声明周期 前面也讲过这块,但是没有图,总觉得不透彻。找来找去找不到合适的图,于是自己画了一个 新建:new 关键字创建 可运行:通过start()可由新建变可运行,内部状
补充2:线程声明周期
前面也讲过这块,但是没有图,总觉得不透彻。找来找去找不到合适的图,于是自己画了一个
新建:new 关键字创建
可运行:通过start()可由新建变可运行,内部状态转换不可见,由JVM决定
就绪:让步,运行会变成就绪,下次调度会再次变运行
阻塞:被动等待,类似于lock锁住的部分进不去,synchronized方法和代码块进不去,信号量拿不到通行证、Future的get()还没拿到结果。期望马上进入或者拿到结果,但是没有立刻获得,就会产生阻塞
等待:主动等待。通过synchronize+wait 方式进行等待,notify()/notifyAll()唤醒,或者Condition+await()方式等待,signal()/signal()唤醒
计时等待:主动等待。通过限时间的wait()/await()方式进行等待,sleep()方式也可进行计时等待,不同的是没有释放锁
终止(死亡):线程异常或者执行结束
补充3:创建线程的三种方式
可能因为自定义线程实际上用的不多的原因,作者讲了Runnable方式、Callable方式,却没讲自定义线程的继承方式,这里补充说明,顺便整理: