一、线程的6中状态
6个状态定义:java.lang.Thread.State
1、New:
尚未启动的线程的线程状态
可运行线程的线程状态,等待CPU调度。
3、Blocked:
线程阻塞等待监视器锁定的线程状态。
处于synchronized同步代码块或方法中被阻塞
4、Waiting:
等待线程的线程状态。下列不带超时的方式:
Object.wait、Thread.join、LockSupport.park
5、Timed Waiting:
具有指定等待时间的等待线程的线程状态。下列带超时的方式:
Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil
6、Teminated:
终止线程的线程状态。线程正常完成执行或者出现异常
二、线程状态示意图
三、线程状态演示
1、第一种状态切换 --新建->运行->终止
System.out.println("######第一种状态切换 --新建->运行->终止#######");
Thread thread1= new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1当前状态:"+Thread.currentThread().getState().toString());
System.out.println("thread1执行了");
}
});
System.out.println("没调用start方法,thread1当前状态:"+thread1.getState().toString());
thread1.start();
//等待thread1执行结束,在看状态
Thread.sleep(2000L);
System.out.println("等待2秒,在看thread1当前状态:"+thread1.getState().toString());
System.out.println();
2、第二种状态切换:新建-->运行->等待->运行->终止(sleep方式)
System.out.println("#######第二种状态切换:新建-->运行->等待->运行->终止(sleep方式)########");
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
//让线程2,等待1500毫秒
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取线程状态
System.out.println("thread2当前状态:"+Thread.currentThread().getState().toString());
System.out.println("thread2执行了");
}
});
System.out.println("没调用start方法,thread2当前状态:"+thread2.getState().toString());
thread2.start();
System.out.println("调用start方法,thread2当前状态:"+thread2.getState().toString());
//等待200毫秒,在看状态
Thread.sleep(200);
System.out.println("等待200毫秒,在看thread2当前状态:"+thread2.getState().toString());
//等待3秒,让thread2执行完毕,在看状态
Thread.sleep(3000);
System.out.println("等待3秒,在看Thread2当前状态:"+thread2.getState().toString());
System.out.println();
3、第三种:新建->运行->阻塞->运行->终止
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("thread3执行了");
}
}
});
synchronized (Demo2.class){
System.out.println("没调用start方法,thread3当前状态:"+thread3.getState().toString());
thread3.start();
System.out.println("调用start方法,thread3当前状态:"+thread3.getState().toString());
//等待200毫秒
Thread.sleep(200);
System.out.println("等待200毫秒,在看thread3当前状态:"+thread3.getState().toString());
}
//在等待3秒,让thread2抢到锁,在看thread3状态
Thread.sleep(3000);
System.out.println("待3秒,让thread3抢到锁,在看thread3状态:"+thread3.getState().toString());