java线程中,线程状态是如何转换的呢?这一次我们一起来学习下。
线程状态:
NEW:
线程创建之后,还没有启动。这时候它的状态就是NEW
RUNNABLE:
正在Java虚拟机下跑任务的线程的状态。在RUNNABLE状态下的线程可能会处于等待状态, 因为它正在等待cpu的时间片。
BLOCKED:
线程处在阻塞状态,共分几种情况,
同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。sleep方法不释放持有的锁
WAITING:
等待状态,wait方法进入,无限期等待,等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。
进入原因:
1.没有超时timeout参数的Object.wait()
2.没有超时timeout参数的Thread.join()
3.LockSupport.park()
TIMED_WAITING:
超时等待状态,无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
1.Thread.sleep()方法
2.设置了超时timeout参数的Object.wait()方法
3.设置了超时timeout参数的Thread.join()方法
4.LockSupport.parkNanos()方法
5.LockSupport.parkUntil()方法
TERMINATED:
线程中止的状态,这个线程已经完整地执行了它的任务。
“阻塞”与“等待”的区别:
(1)“阻塞”状态是等待着获取到一个排他锁或资源(如IO输入等),进入“阻塞”状态都是被动的,离开“阻塞”状态是因为其它线程释放了锁;
(2)“等待”状态是在等待一段时间 或者 唤醒动作的发生,进入“等待”状态是主动的。
如下图所示,各种状态的转换关系如下
《Java多线程编程核心技术》图片
Java线程调度:
协同式:
线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上。
抢占式:
每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定,Java采用这种方式调度,但我们可以"建议"操作系统,给予都些重要的线程更多的执行时间。如何做呢?就是通过“线程优先级”
线程优先级
java的线程Thread类中,有几个常量定义优先级,
static int MAX_PRIORITY
线程可以具有的最高优先级10。
static int MIN_PRIORITY
线程可以具有的最低优先级1。
static int NORM_PRIORITY
分配给线程的默认优先级5。
而实际优先级为1-10,但使用除上面之外的其他优先级需要关注,对应操作系统可能与对应优先级别,建议使用上面三个。
领取专属 10元无门槛券
私享最新 技术干货