487
京东网上商城
java线程的6种状态以及相互转换
线程状态
1、java线程有6中状态,分别为NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED详解java.lang.Thread$State枚举类
2、线程初始化为NEW状态,该状态表示还未调用start方法
3、执行线程调用start方法,线程状态转换为RUNNABLE(包括竞争到CPU时间真正意义的执行和没有竞争到CPU时间等待下一个CPU时间的状态)
4、BLOCKED状态为锁竞争,没有竞争到锁为BLOCKED,等待拥有锁的线程释放锁,进入RUNNABLE状态
5、WAITING状态为竞争到锁,执行wait方法,又释放锁,本线程进入WAITING,等待其他线程唤醒notify,notifyall,如果不唤醒,将一直处于WAITING状态
6、TIMED_WAITING为执行sleep join或者有时限的等待
7、线程执行完毕,线程处于TERMINATED状态
线程状态变化
package com.rcl.platform.demo;
import java.util.concurrent.TimeUnit;
public class ThreadState {
public static void main( String[] args ) throws InterruptedException {
System.out.println("-------------NEW-------------");
Thread thread = new Thread();
System.out.println(thread.getState() + ":" + (thread.getState() == Thread.State.NEW));
System.out.println("-------------分割线-------------");
System.out.println("-------------RUNNABLE、TERMINATED-------------");
thread = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getState() + ":" + (Thread.currentThread().getState() == Thread.State.RUNNABLE));
}
});
thread.start();
TimeUnit.SECONDS.sleep(1);
System.out.println(thread.getState() + ":" + (thread.getState() == Thread.State.TERMINATED));
System.out.println("-------------分割线-------------");
System.out.println("-------------RUNNABLE、TIMED_WAITING-------------");
thread = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getState() + ":" + (Thread.currentThread().getState() == Thread.State.RUNNABLE));
System.out.println("sleep 进入 TIMED_WAITING");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
TimeUnit.SECONDS.sleep(1);
System.out.println(thread.getState() );
TimeUnit.SECONDS.sleep(2);
System.out.println("-------------分割线-------------");
System.out.println("-------------RUNNABLE、TIMED_WAITING-------------");
final Thread mainThread = Thread.currentThread();
thread = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getState() + ":" + (Thread.currentThread().getState() == Thread.State.RUNNABLE));
try {
System.out.println("join 进入 TIMED_WAITING");
System.out.println("mainThread: " + mainThread.getState());
TimeUnit.SECONDS.timedJoin(mainThread, 2);//先执行mainthread
System.out.println("mainThread: " + mainThread.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("testThread: " + thread.getState() );
System.out.println("-------------分割线-------------");
System.out.println("-------------RUNNABLE、WAITING-------------");
Object lock = new Object();
final Thread mainThread1 = Thread.currentThread();
thread = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
try {
System.out.println("wait 进入 WAITING");
lock.wait();
System.out.println("mainThread1: " + mainThread1.getState() );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("testThread: " + thread.getState() );
synchronized (lock) {
lock.notifyAll();
}
TimeUnit.SECONDS.sleep(1);
System.out.println("-------------分割线-------------");
Thread thread1 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
}
}
});
thread2.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("thread2: " + thread2.getState() );
}
}
执行结果
-------------NEW-------------
NEW:true
-------------分割线-------------
-------------RUNNABLE、TERMINATED-------------
RUNNABLE:true
TERMINATED:true
-------------分割线-------------
-------------RUNNABLE、TIMED_WAITING-------------
RUNNABLE:true
sleep 进入 TIMED_WAITING
TIMED_WAITING
-------------分割线-------------
-------------RUNNABLE、TIMED_WAITING-------------
RUNNABLE:true
join 进入 TIMED_WAITING
mainThread: TIMED_WAITING
testThread: TIMED_WAITING
-------------分割线-------------
-------------RUNNABLE、WAITING-------------
wait 进入 WAITING
mainThread: TIMED_WAITING
testThread: WAITING
mainThread1: TIMED_WAITING
-------------分割线-------------
thread2: BLOCKED
最后更新:2017-10-28 12:04:04