Java线程类的状态
通过查找java.lang.Thread.State下面的源码我们得知线程的状态有一下6种:
- NEW:尚未启动的状态
- RUNNABLE:表示这是可以运行的线程,等待cpu调度
- BLOCKED:线程阻塞,等待监视器锁定的状态,一般是出于synchronized同步代码块中或者方法被阻塞会出现这种状态
- WAITING:处于线程等待的状态,不带超时时间。当执行Object.wait、Thread.join、LockSupport.park方法的时候,线程会处于这个状态,需要被其他线程唤醒后才会继续执行
- TIMED_WAITING:具有指定的等待时间的等待状态,有超时时间。当执行Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil方法时会处于这个状态,等待时间到了会做处理
- TERMINATED:表示线程终止了,或者是结束了或者是出现异常了。
具体测试代码如下:
//线程状态
public class Demo2 {
public static void main(String[] args) throws Exception{
//第一种状态切换 新建-》运行-》终止
System.out.println("第一种状态切换 新建-》运行-》终止=======================================");
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程当前状态:"+Thread.currentThread().getState().toString());
System.out.println("thread1执行了");
}
});
System.out.println("没有调用start方法,thread1当前状态:"+thread1.getState().toString());
thread1.start();
Thread.sleep(2000L); //等待线程执行结束再看状态
System.out.println("等待1秒再看thread1线程状态"+thread1.getState().toString());
System.out.println();
//第二种状态切换 新建-》运行-》等待-》运行-》终止(sleep方式)
System.out.println("第二种状态切换 新建-》运行-》等待-》运行-》终止(sleep方式)=======================================");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前thread2状态:"+Thread.currentThread().getState().toString());
System.out.println("线程2执行了");
}
});
System.out.println("没有调用start方法,thread2当前状态:"+thread2.getState().toString());
thread2.start();
System.out.println("调用start方法,thread2当前状态:"+thread2.getState().toString());
Thread.sleep(200L); //等待200毫秒,再看状态
System.out.println("等待200毫秒,再看thread2当前状态:"+thread2.getState().toString());
Thread.sleep(3000L); //再等待3秒等thread2执行完毕,再看状态
System.out.println("再等待3秒等thread2执行完毕,再看状态"+thread2.getState().toString());
System.out.println();
//第三种状态切换 新建-》运行-》阻塞-》运行-》终止
System.out.println("第三种状态切换 新建-》运行-》阻塞-》运行-》终止=======================================");
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(Demo2.class) {
System.out.println("当前thread3状态:"+Thread.currentThread().getState().toString());
System.out.println("线程3执行了");
}
}
});
synchronized (Demo2.class) {
System.out.println("没有调用start方法,thread3当前状态:"+thread3.getState().toString());
thread3.start();
System.out.println("调用start方法,thread3当前状态:"+thread3.getState().toString());
Thread.sleep(200L); //等待200毫秒,再看状态
System.out.println("等待200毫秒,再看thread3当前状态:"+thread3.getState().toString());
}
Thread.sleep(3000L);
System.out.println("等待3秒,让thread3抢到锁,再看thread3当前状态:"+thread3.getState().toString());
}
}
运行结果如下: