Java线程Thread.class源码中未找到线程状态切换的地方,请教各位大神,threadStatus切换源代码在哪里找?
发布网友
发布时间:2022-05-20 22:03
我来回答
共2个回答
热心网友
时间:2023-10-03 06:38
[1]新生状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(notalive)。
[2]就绪状态(Runnable):通过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPCU,等待状态并不是执行状态;此时线程是活着的(alive)。
[3]运行状态(Running):一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行自己的run()方法中的操作,直到调用其他的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;如果在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive)。
[4]阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)。
[5]死亡状态(Dead):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡(dead)状态。此时可能仍然存在一个该Thread的实例对象,当该Thread已经不可能在被作为一个可被独立执行的线程对待了,线程的独立的callstack已经被dissolved。一旦某一线程进入Dead状态,他就再也不能进入一个独立线程的生命周期了。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(runtimeexception)的异常;处于Dead状态的线程不是活着的(notalive)。追问我问的并不是这个意思,这五种状态我晓得,我问题的意思是源代码中线程状态切换的代码实现我找不到
热心网友
时间:2023-10-03 06:38
其实,threadStatus的切换是在JVM调用Thread.class中第714行start0();时进行的,这个方法的声明如下:
Thread.class中第728行private native void start0(); // 有个native修饰符,说明这是调用了C++实现的方法
再看JVM对threadStatus的定义:private volatile int threadStatus = 0;// 这是内存可见的,就是要保证JVM通过C++可见,而且java也可以拿到该值。追问昨天的追问怎么消失了。。。
----------------------------------
你的意思是threadStatus的状态修改由底层的C++代码实现,threadStatus的状态值变化JVM是可见的,但是做为程序员无法看到threadStatus改变的具体实现方式,是这样吗?