博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程的生命周期及五种基本状态
阅读量:5112 次
发布时间:2019-06-13

本文共 1666 字,大约阅读时间需要 5 分钟。

我们知道线程是操作系统能够进行运算调度的最小单位,在java中的线程其实就是对操作系统的中的线程进行了封装。

我们今天就来说说Java线程的生命周期,也就线程的生老病死!

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

  • New(初始化状态)

  • Runnable(就绪状态)

  • Running(运行状态)

  • Blocked(阻塞状态)

  • Terminated(终止状态)

 

1.New(初始化状态)当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

2.Runnable(就绪状态):当调用线程对象的start()方法,线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了start()此线程立即就会执行;

3.Running(运行状态)当就绪状态中的线程获得了CUP执行资源,执行run()中的代码,这样的线程我们称为运行状态的线程。

4.Blocked(阻塞状态)处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。线程的阻塞状态分为两种:

第一种,Waiting(无时间限制的等待状态)

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

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

第二种,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)。

5.Terminated(终止状态):在我们的线程正常run结束之后或者run一半异常了就是终止状态!

注意有个方法Thread.stop()是让线程终止的,但是这个方法已经被废弃了,不推荐使用,因为比如你这个线程得到了锁,你stop了之后这个锁也随着没了,其它线程就都拿不到这个锁了!这不玩完了么!

所以推荐使用interrupt()方法。

interrupt()会使得线程Waiting和Timed_Waiting状态的线程抛出 interruptedException异常,调用interrupt()方法后,使得Running状态的线程再调用wait()、sleep()、jion()方法时抛出interruptedException异常,需要在catch中处理线程异常后的问题

 

如果Running状态的线程没有阻塞在I/O状态的话,那只能主动检测自己是不是被中断了,使用isInterrupted()。

 

转载于:https://www.cnblogs.com/codebj/p/11027113.html

你可能感兴趣的文章
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
python常用函数
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
数据库3
查看>>