Java线程状态有哪些?NEW:当new Thread时,创建线程对象,此时线程处于NEW状态;
RANNABLE:当调用start方法时启动一个线程,线程状态切换为RANNABLE就堵状态,并进入cpu运行队列,等待操作系统时间片调度运行;
BLOCKED:当执行过程中发生资源未就绪而阻塞时会让出CPU的运行时间片,线程状态切换为BLOCKED状态,比如等待IO设备、等待锁的释放;一旦资源就绪,则将线程重新加入到CPU的运行队列,等待操作系统调度CPU时间片,线程状态重新回到RUNNABLE;
WAITING/TIMED_WAITING:当调用wait/sleep/join/locksupport.lock时线程处于WAITING状态,如果方法带有超时时间,则处于TIMED_WAITING状态,
TERMINATED:当线程运行完成,则将变成TERMINATED状态。
线程处于什么状态时会消耗CPU资源?
除RANNABLE状态外,线程并未执行或让出CPU,所以不消耗CPU资源。而处于RANNABLE仅代表线程处于就绪状态,还需要等待CPU时间片,所以仅当线程处于RANNABLE状态且等到CPU时间片时开始消耗CPU资源。
怎么查看当前运行哪些线程及线程状态?
通过jstack打印线程堆栈,包含所有线程信息和线程状态,或通过jconsole图形化界面查看。
jstack
打印片段:
"RMI TCP Accept-0" #205 daemon prio=4 os_prio=31 cpu=2.61ms elapsed=785100.56s tid=0x00007fa0277c5000 nid=0xbb3b runnable [0x000070001c729000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(java.base@11.0.8/Native Method)
at java.net.AbstractPlainSocketImpl.accept(java.base@11.0.8/AbstractPlainSocketImpl.java:458)
at java.net.ServerSocket.implAccept(java.base@11.0.8/ServerSocket.java:565)
at java.net.ServerSocket.accept(java.base@11.0.8/ServerSocket.java:533)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(java.rmi@11.0.8/TCPTransport.java:394)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(java.rmi@11.0.8/TCPTransport.java:366)
at java.lang.Thread.run(java.base@11.0.8/Thread.java:834)