线程生命周期你知道多少?

xl_echo编辑整理,欢迎转载,转载请声明文章来源。更多IT、编程案例、资料请联系QQ:1280023003
百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!


从之前的案例我们了解到多线程的作用优势,这里我们更详细的了解线程的创建和结束。

线程的生命周期主要分为以下几个阶段:
- 新建(new Thread)
- 就绪(runnable)
- 运行(running)
- 堵塞(blocked)
- 死亡(dead)

之前我们的案例中直接的看到的以上状态有“新建、死亡”,那么其他状态是怎么样子的呢?下面我们逐个详细讲解。

新建

新建线程的方法有几种,一种就是继承Thread,一种就是实现runnable接口,还有线程池等方法。之前的案例,我们就是使用的匿名内部内Thread来启动的线程。但是使用关键字new创建一个Thread对象时,此时它并不处于执行状态,因为它没有调用start方法启动该线程。所以这里我们可以这样认为,使用new之后没有使用start启动的线程,都是属于处在新建状态的线程。

就绪

使用new新建线程之后,其实只是准别新建线程,真正在JVM进程中创建一个线程是在我们使用start启动之后。但是很多人在这里有认识误区,以为使用start启动之后,线程就启动了,在认知中就绪是很容易被忽略的。 其实使用start之后,线程只是进入了可以被运行的状态而已。并不是已使用start就开始运行,主要的原因是我们的所有线程和进程都受到CPU的管理。如果CPU一直在执行其它任务,并没有来调用该线程,那么从start之后到被调用之前就叫做就绪

运行

当CPU在执行队列中选中了线程之后,我们的线程就进入了运行状态。可能如果使用CPU调度之类的说比较抽象,不容易观察。那么我们可以根据之前案例来了解。比如之前我们使用的案例,一个在看书,一个在听音乐。这是两个线程的,当我们观察到两个while循环在不断执行的时候那就是线程的运行。

阻塞

多数的线程阻塞都是人为使用手段进行干预造成的,但是这也是我们编写程序不可以缺少的一部分,就上文中的案例中,我们可以看到while死循环是个一小会打印一行,个一小会打印一行,这个输出结果其实就是我们在其中使用阻塞完成的。
一般使线程阻塞的方法以下几种:
- sleep或者wait,上文用的就是sleep,使线程休息一秒
- 线程主动调用yield方法,放弃CPU执行
- 获取某个已经锁定的资源

以上的方法也可以经过程序被唤醒,让程序继续执行。
- Wait中的线程被其他notify/notifyall唤醒
- sleep等待休息时间即可,不需要唤醒。

死亡

死亡是一个线程的最终状态,同时也意味着线程的整个生命周期结束。线程的死亡有多种方式
- 线程运行正常结束,结束生命周期
- 线程运行错误意外结束
- JVM 意外崩溃、中断,导致所有线程结束

猜你喜欢

转载自blog.csdn.net/xlecho/article/details/81478920
今日推荐