目录
一.线程状态(6种)
1.NEW 2.RUNNABLE 3.TIMED_WAITING 4.BLOCKED 5.WAITING 6.TERMINATED
调用Thread类的getState()方法可以获取当前线程的状态

1.1.NEW(初始状态)
当前线程被创建,但是还没有调用start()方法启动线程
java
public class Demo5 {
public static void main(String[] args) {
Thread t1=new Thread(()->
{
System.out.println("t1线程启动");
});
System.out.println(t1.getState());
t1.start();
}
}

1.2.RUNNABLE (运行状态)
将线程正在CPU上运行或者线程已经准备就绪,随时可以去CPU 上运行的状态成为运行状态
java
package Thread;
public class Demo5 {
public static void main(String[] args) {
Thread t1=new Thread(()->
{
while(true) {
System.out.println("my thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println(t1.getState());
t1.start();
System.out.println(t1.getState());
}
}

1.3.TIMED_WAITING(限时阻塞状态)
指定时间的阻塞(具有时间限定)如:
sleep(long millis) 、join(long millis)等 

1.4.BLOCKED(阻塞状态)
当线程试图获取一个被其他线程持有的锁时,线程进入阻塞状态。此时,线程无法继续执行,直到获得所需的锁。
java
public class Demo6 {
public static void main(String[] args) {
Object locker=new Object();
Thread t1=new Thread(()->{
synchronized (locker){
System.out.println("hello t1");
try {
Thread.sleep(400000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2=new Thread(()->{
synchronized (locker){
System.out.println("hello t2");
}
});
t1.start();
t2.start();
}
}

jconsole 可以来查看线程状态

可以看到线程t2被是阻塞状态,因为线程t2执行需要的锁被线程t1占用了。
1.5.WAITING(等待状态)
死等,不加时间的等待,直到被其他线程主动唤醒 join()/wait()
java
public class Demo7 {
public static void main(String[] args) throws InterruptedException {
Object locker=new Object();
Thread t1=new Thread(()->
{
synchronized (locker){
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread.sleep(1000);
System.out.println(t1.getState());
}
}

1.6.TERMINATED(终止状态)
线程工作已经完成了,内核中的线程已经结束了,但Thread对象依旧存在,因为进程还没有结束,进程结束后,JVM会自动回收对象
java
public class Demo8 {
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(()->
{
for (int i = 0; i < 3; i++) {
System.out.println("haha");
}
System.out.println("t1线程已结束");
});
t1.start();
t1.join();
System.out.println(t1.getState());
}
}

二.状态之间的切换条件

线程状态到这里就结束了,下一篇我将讲述线程安全的问题