结尾有
彩蛋
哦
new
方法创建线程时,线程就创建了吗?start
方法后,线程就被执行了吗?BLOCKED
状态直接进入RUNNING
状态吗?TERMINATED
状态转换为其他状态吗?根据线程的生命周期,可以分为5个状态,但是如果从编程角度分析:有另一个版本的线程状态分类
当使用new
关键字创建一个线程对象时,此时线程并不是可执行状态,因为这时候还没有调用start
方法,这个时候的线程处于NEW
状态。
此时线程是不存在的
,对,这个时候应该说只是创建了一个线程对象,并没有创建线程(第一个问题答案)。
NEW
状态的线程只可以通过start
方法进入RUNNABLE
状态,只能进入RUNNABLE
状态,不能进入RUNNING
状态(实际上RUNNING
状态可以看成一种特殊的RUNNABLE
状态)。
通过调用start方法线程对象进入RUNNABLE
状态,这个时候JVM
才会正在的去创建线程,但是此时线程没有被立即执行,或者说不能被立即执行(第二个问题答案)。线程是否被执行取决于能否得到CPU的调度,
也是由于这个原因,线程无法从new状态直接进入RUNNING
状态,即便得到调度的时间很短。
另外,RUNNABLE
状态的线程是不能直接进入BLOCKED
状态的。
排除意外终止
的情况,RUNNABLE
状态的线程只能进入RUNNING
状态。原因很简单,即便我们调用了wait
,sleep
或者其他的线程操作,这些操作也必须得到CPU调度才能生效,一旦线程得到CPU调度,线程的状态也就从RUNNABLE
转换为了RUNNING
。
一旦CPU从任务的可执行队列里选中了线程,线程这时候就转换为了RUNNING状态,也是这时候才开始执行自己的逻辑代码(包括wait,sleep等方法)。
RUNNING状态的线程可以发生如下几种情况的转换:
BLOCKED
状态,例如:通过调用sleep
或者wait
方法,线程被加入到waitSet
中。BLOCKED
状态,例如:获取锁资源,或者遇到阻塞IO操作等TERMINATED
状态,例如:调用了stop
方法(该方法已经不推荐使用)或者意外中断。RUNNABLE
状态,调用yield方法放弃CPU的执行权。RUNNABLE
状态,CPU调度器放弃了该线程的执行权。这个队列就是
ThreadGroup
,它非常重要
说到这个
waitSet
,上面说如果按照编程角度来看,还有其他的一种为线程分类的方式,而在waitSet
中的线程在那种分类方式中叫Timed Waiting(限期等待)
上面已经阐述了线程如何进入BLOCKED状态,接下来就聊一下线程可以从BLOCKED状态切换到哪些状态:
TERMINATED
状态,例如:调用了stop
方法(该方法已经不推荐使用)或者意外中断(例如:JVM Crash导致所有线程结束)。RUNABLE
状态。RUNNABLE
状态notify
或notifyall
唤醒,进入RUNNABLE
状态RUNNABLE
状态。interrup
t方法,线程进入RUNNABLE
状态线程是不能从
BLOCKED
状态直接进入RUNNING
状态的。(问题3)
先回答一下上面第四个的问题,线程是不能从TERMINATED
状态转换为其他状态的。TERMINATED
是线程的最终状态,线程进入该状态意味着线程的整个生命周期结束。
超神学院语录
我心存彦,吾彦永恒
Thread中的start和run方法是什么关系?
微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很...
歌词编辑器 歌词编辑器 第一步:选择要播放的歌曲并播放 第二步:填写全部的歌词...
前言 相信大家都知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也...
一石激起千层浪,继中国区浩浩荡荡的大裁员告一段落之后,甲骨文并未因此收起手...
vbs:把一段文字中指定字符颜色变成红色的正则 functionc(Tstr,Word) Dimre Setre...
本文将研究 ES6 的 for ... of 循环。 旧方法 在过去,有两种方法可以遍历 javas...
【排序算法】之lowb三人组冒泡、插入、选择 什么是lowb三人组 冒泡排序bubble so...
一、正则表达式概述 二、正则表达式在VBScript中的应用 三、正则表达式在VavaScr...
ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可...
计算属性computed: 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持...