Java多线程状态
共有6种状态
1.New 线程被创建出来时的状态
2. RUNNABLE 线程被调用了start(),正在运行状态,即表示Running状态和Ready状态。
3.BLOCKED 等待监视锁,这个时候线程被操作系统挂起。当进入synchronized块/方法或者
在调用wait()被唤醒/超时之后重新进入synchronized块/方法,锁被其它线程占有,这个时候被操作系统挂起,状态为阻塞状态。
4.WAITING 无条件等待,当线程调用wait()/join()/LockSupport.park()不加超时时间的方法之后所处的状态,
如果没有被唤醒或等待的线程没有结束,那么将一直等待,当前状态的线程不会被分配CPU资源和持有锁。
5.TIMED_WAITING 有条件的等待,当线程调用sleep(睡眠时间)/wait(等待时间)/join(等待时间)/
LockSupport.parkNanos(等待时间)/LockSupport.parkUntil(等待时间)方法之后所处的状态,
在指定的时间没有被唤醒或者等待线程没有结束,会被系统自动唤醒,正常退出。
6.TERMINATED 执行完了run()方法
各状态关系图如下
public class TestStates implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}System.out.println("run()执行完毕");
}
public static void main(String[] args) {
TestStates testStates=new TestStates();
Thread thread=new Thread(testStates);
Thread.State state;//获取(创建)线程状态
state=thread.getState();
System.out.println(state);
thread.start();
state=thread.getState();//获取(就绪)线程状态
System.out.println(state);
while(state!=Thread.State.TERMINATED){
try {
Thread.sleep(100);
state=thread.getState();
System.out.println(state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果:
NEW
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
run()执行完毕
TERMINATED