Java-多线程状态获取异常!

coffee_cold 2019-09-27 11:26:51
!!!线程状态转换问题!
问题简述:
下面的代码中,B线程被设计为Daemon线程,用来不断获取A线程的运行状态并输出。奇怪的事情出现了!
B线程有一定可能获取到A线程的状态为Blocked!!!这是为什么?好奇,求大佬解答,万分感谢!!!
(大佬可以直接编译并运行下面的代码,多运行几次就会发现我所述的现象。)



import static java.lang.System.in;
import static java.lang.System.out;
import java.util.Scanner;
import java.text.DecimalFormat;
public class Temp{
public static void main(String... args) throws InterruptedException{
//通过Thread调用实现了runnable接口的类所生产的实例
Runnable runnerA = new Runnable(){
public void run(){
int i=10;
while(i-->0){
out.println("runnerA's step:"+i+"\t#"+Thread.currentThread().getState());
}
}
};
Thread threadA = new Thread(runnerA);
//直接继承Thread类
Thread threadB = new Thread(){
public void run(){
int i=200;
while(i-->0){
out.println("runnerB's step:"+i);
out.println("threadB中观察threadA的状态为:"+threadA.getState());
}
}
};
//类似于直接继承Thread类,但方式是通过lambda表达式来设计
new Thread(()->{
int i=20;
while(i-->0) out.println("runnerC's step:"+i);
}).start();
out.println("启动threadA前:"+threadA.getState());
threadA.start();
out.println("启动threadA后:"+threadA.getState());
threadB.setDaemon(true);
threadB.start();
//Thread.sleep(100);
}
}
...全文
105 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
coffee_cold 2019-09-29
  • 打赏
  • 举报
回复
多谢老哥解答 我找到问题所在了:System.out.println方法是线程安全的
coffee_cold 2019-09-29
  • 打赏
  • 举报
回复
结贴:洗完澡后智商上线,java.lang.System.out的println()方法是线程同步(线程安全)的,blocked状态就是因这个而来。
oh_Maxy 2019-09-28
  • 打赏
  • 举报
回复
多个线程同时在跑,会有CPU切换。当前正在运行的线程,要让出CPU时,就是阻塞状态的。
coffee_cold 2019-09-27
  • 打赏
  • 举报
回复
个人觉得,是不是JVM中线程在中止之前会跳转到Blocked状态,随后才是跳转到TERMINATED 。仅是个人猜测。
coffee_cold 2019-09-27
  • 打赏
  • 举报
回复
输出示例: ... 启动threadA前:NEW runnerC's step:19 runnerC's step:18 启动threadA后:RUNNABLE runnerA's step:9 #RUNNABLE runnerC's step:17 runnerA's step:8 #RUNNABLE runnerC's step:16 runnerA's step:7 #RUNNABLE runnerC's step:15 runnerA's step:6 #RUNNABLE runnerC's step:14 runnerA's step:5 #RUNNABLE runnerC's step:13 runnerB's step:199 runnerA's step:4 #RUNNABLE threadB中观察threadA的状态为:RUNNABLE runnerC's step:12 runnerB's step:198 threadB中观察threadA的状态为:BLOCKED runnerA's step:3 #RUNNABLE runnerB's step:197 runnerC's step:11 threadB中观察threadA的状态为:BLOCKED runnerB's step:196 runnerA's step:2 #RUNNABLE runnerA's step:1 #RUNNABLE threadB中观察threadA的状态为:RUNNABLE runnerB's step:195 runnerC's step:10 threadB中观察threadA的状态为:BLOCKED runnerB's step:194 runnerA's step:0 #RUNNABLE threadB中观察threadA的状态为:RUNNABLE runnerC's step:9 runnerB's step:193 runnerC's step:8 threadB中观察threadA的状态为:TERMINATED runnerB's step:192 runnerC's step:7 runnerC's step:6 threadB中观察threadA的状态为:TERMINATED runnerB's step:191 runnerC's step:5 runnerC's step:4 threadB中观察threadA的状态为:TERMINATED runnerC's step:3 runnerB's step:190 runnerC's step:2 threadB中观察threadA的状态为:TERMINATED runnerC's step:1 runnerB's step:189 runnerC's step:0 threadB中观察threadA的状态为:TERMINATED

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧