网站首页 > 精选教程 正文
线程状态介绍
这里我们讲的是Java中的线程状态。
线程状态如下:
“线程初始状态:NEW线程运行状态:RUNNABLE线程阻塞状态:BLOCKED线程等待状态:WAITING超时等待状态:TIMED_WAITING线程终止状态:TERMINATED”
其中等待状态应该是一个比较复杂且重要的状态。
线程进入等待状态,即线程因为某种原因放弃了CPU使用权,阻塞也分为几种情况:
- 等待阻塞:运行的线程执行wait方法,JVM会把当前线程放入到等待队列
- 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其他线程锁占用了,那么JVM会把当前的线程放入到锁池中
- 其他阻塞:运行的线程执行Thread.sleep或者join方法,或者发出了I/O请求时,JVM会把当前线程设置为阻塞状态,当sleep结束join线程终止、I/O处理完毕则线程恢复
线程状态间的转换如下图:
下面我将讲解哪些情况会进入这些状态。
线程sleep时的状态
运行结果
new t1 t1 的状态:NEW
t1 running is false,t1将sleep
t1.sleep()时的状态:TIMED_WAITING
我们来分析一下,当new Thread时,线程t1[Thread-0]状态为NEW。线程启动,执行run()方法,打印t1 running is false,t1将sleep,此时线程t1睡眠。然后主线程睡眠,变量running设置为false。这线程t1还在睡眠中。再将主线程睡眠,线程t1仍然在睡眠中。此时线程t1的状态为TIMED_WAITING。
如果我们将线程t1中的睡眠时间修改一下
Thread.sleep(10000L); -> Thread.sleep(3000L);
再来看看运行结果
new t1 t1 的状态:NEW
t1 running is false,t1将sleep
t1.sleep()时的状态:TERMINATED
线程t1终止,所以说看代码时不要认为一看到sleep()就是超时等待【TIMED_WAITING】状态。要看看线程是否已经终止了。
线程join时的状态
运行结果如下
t2中执行t1.join(5000L)
t2的状态:TIMED_WAITING
t2中执行t1.join()
t2的状态:WAITING
t2执行完
当执行
t1.start();
t2.start();
线程t1执行睡眠,此时进入线程t2,并执行t2中执行t1.join(5000L)。接下来t1会抢占,进入主线程,主线程睡眠,此时t2还在等待t1,所以t2的线程状态为【TIMED_WAITING】。这时主线程又睡眠,t2里面开始执行t1.join(),此时t2的状态为【WAITING】。
线程synchronized时的状态
我们来看运行结果
t1抢不到锁的状态:BLOCKED
t1抢到锁
主线程启动,先抢到锁。此时t1.start()启动了t1线程,这时候主线程睡眠,锁还没有释放。此时的t1状态为【BLOCKED】。
线程wait时的状态
运行结果
t1将wait(1000L)
t1的状态:TIMED_WAITING
t1的状态:BLOCKED
t1将wait
t1的状态:WAITING
t1将执行完
t1的状态:RUNNABLE
t1的状态:TERMINATED
主线程启动,执行t1.start(),进入t1,执行t1将wait(1000L),此时t1让出锁。在t1超时等待的同时,主线程睡眠。当后,这里主线程抢到锁,t1的状态为【TIMED_WAITING】。这时主线程执行object.notify(),但这时锁还没有释放,t1还没有获取到锁,所以t1状态【BLOCKED】。之后主线程释放锁,t1获得锁,执行object.wait(),这时t1的状态【WAITING】。然后回到主线程,并获得锁,执行object.notify()。此时t1线程被唤醒并处于运行状态【RUNNABLE】。t1执行完成,状态为【TERMINATED】。
线程park()时的状态
t1 park后的状态:WAITING
t1 unpark后的状态:WAITING
大家可以思考下线程t1为什么是这个状态,有机会我会写一篇LockSupport的文章。
- 上一篇: Java:线程的六种状态及转化
- 下一篇: 洛阳课工场—Java学习中线程的6种状态有哪些
猜你喜欢
- 2024-11-18 Java并发编程线程状态转换
- 2024-11-18 Java面试必考问题:线程的生命周期
- 2024-11-18 Java 19 虚拟线程的状态变化,停驻与锁定
- 2024-11-18 Java线程生命周期详解?
- 2024-11-18 线程从创建最终消亡,要经历的若干状态,你了解其中的多少?
- 2024-11-18 java线程状态之WAITING(等待)
- 2024-11-18 浅谈Java线程:线程基础知识扫盲
- 2024-11-18 Java线程在各个状态下调用start方法会发生什么事情?
- 2024-11-18 为什么Java中线程没有Running状态
- 2024-11-18 阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)