在java里线程的状态分为6种
NEW:线程对象创建出来了但是没有执行
RUNNABLE: 准备就绪(正在CPU上运行+在就绪队列上排队)
TERMINATED:线程结束,线程对象还在
BLOCKED: 等待锁的时候进入阻塞状态
WAITING: 特殊的阻塞状态,调用wait
TIMED_WAITING: 按照一定的时间,进行阻塞。sleep
后3个都可以叫做阻塞状态
状态的演示
class MThread extends Thread {
@Override
public void run() {
//线程内容
for(int i = 0 ; i< 10 ; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 Thread");
}
}
}
public static void main(String[] args) throws InterruptedException {
MThread mThread = new MThread();
System.out.println("只创建线程,没有启动线程 状态"+mThread.getState());
mThread.start();
mThread.join();
System.out.println("线程结束 状态"+mThread.getState());
}
看状态
一开始没启动的时候状态 是 NEW
结束线程状态TERMINATED
RUNNABLE 状态
public static void main(String[] args) throws InterruptedException {
MThread mThread = new MThread();
System.out.println("只创建线程,没有启动线程 状态"+mThread.getState());
mThread.start();
while (mThread.isAlive()) {
System.out.println(mThread.getState());
}
System.out.println("线程结束 状态"+mThread.getState());
}
BLOCKED状态 和 TIMED_WAITING
public static void main(String[] args) {
final Object object = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}, "t1");
t1.start();
// while (t1.isAlive()){
// System.out.println(t1.getState());
// }
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("hehe");
}
}
}, "t2");
t2.start();
// while (t2.isAlive()){
// System.out.println(t2.getState());
// }
}
解开 第一个注释就能看到 TIMED_WAITING
解开 第二个注释就能看到 BLOCKED
WAITING状态
把上面的Thread.sleep(1000); 换成 object.wait();
解开注释1