动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

浅析线程的生命周期

05-20 14:33 663浏览
举报 T字号
  • 大字
  • 中字
  • 小字

我们知道线程是操作系统能够进行运算调度的最小单位,在Java中的线程其实就是对操作系统的中的线程进行了封装。而线程和很多自然界的事物一样,有自己的生老病死,这一过程就称之为线程的生命周期,也就是线程的初始化状态到线程的终止状态的这一过程。

Java的线程生命周期有六种状态:

1.New(初始化状态)

指的是在高级语言,比如Java。在Java层面的线程被创建了,而在操作系统中的线程其实是还没被创建的,所以这个时候是不可能分配CPU执行这个线程的!所以这个状态是高级语言独有的,操作系统的线程没这个状态。我们New了一个线程,那时候它就是这个状态。

2.Runnable(可运行/运行状态)

这个状态下是可以分配CPU执行的,在New状态时候我们调用start()方法后线程就处于这个状态。

3.Blocked(阻塞状态)

这个状态下是不能分配CPU执行的,只有一种情况会导致线程阻塞,就是synchronized!我们知道被synchronized修饰的方法或者代码块同一时刻只能有一个线程执行,而其他竞争锁的线程就从Runnable到了Blocked状态!当某个线程竞争到锁了它就变成了Runnable状态。注意并发包中的Lock,是会让线程属于等待状态而不是阻塞,只有synchronized是阻塞。(感觉是历史遗留问题,没必要多一个阻塞状态和等待没差啊)。

4.Waiting(无时间限制的等待状态)

这个状态下也是不能分配CPU执行的。有三种情况会使得Runnable状态到waiting状态

调用无参的Object.wait()方法。等到notifyAll()或者notify()唤醒就会回到Runnable状态。调用无参的Thread.join()方法。也就是比如你在主线程里面建立了一个线程A,调用A.join(),那么你的主线程是得等A执行完了才会继续执行,这是你的主线程就是等待状态。调用LockSupport.park()方法。LockSupport是Java6引入的一个工具类Java并发包中的锁都是基于它实现的,再调用LocakSupport.unpark(Thread thread),就会回到Runnable状态。

5.Timed_Waiting(有时间限制的等待状态)

其实这个状态和Waiting就是有没有超时时间的差别,这个状态下也是不能分配CPU执行的。有五种情况会使得Runnable状态到waiting状态

Object.wait(long timeout)。Thread.join(long millis)。Thread.sleep(long millis)。注意 Thread.sleep(long millis, int nanos) 内部调用的其实也是Thread.sleep(long millis)。LockSupport.parkNanos(Object blocked,long deadline)。LockSupport.parkUntil(long deadline)。

6.Terminated(终止状态)

在我们的线程正常run结束之后或者run一半异常了就是终止状态!注意有个方法Thread.stop()是让线程终止的,但是这个方法已经被废弃了,不推荐使用,因为比如你这个线程得到了锁,你stop了之后这个锁也随着没了,其它线程就都拿不到这个锁了!这不玩完了么!所以推荐使用interrupt()方法。

interrupt()会使得线程Waiting和Timed_Waiting状态的线程抛出 interruptedException异常,使得Runnabled状态的线程如果是在I/O操作会抛出其它异常。如果Runnabled状态的线程没有阻塞在I/O状态的话,那只能主动检测自己是不是被中断了,使用isInterrupted()。

我们其实不难发现,线程的生命周期其实是一个很有规律的过程,我们只要掌握了这个规律,就能玩转线程的各个生命周期的状态了,当然我们更多的是需要线程生命周期的各个状态的了解,这一点我们可以靠动力节点在线的免费视频课程完美解决,我们在观看视频课程的过程中更是要举一反三,才能收获更多!

0人推荐
共同学习,写下你的评论
0条评论
代码小兵498
程序员代码小兵498

153篇文章贡献528999字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消