线程生命周期
线程生命周期转换图:
线程生命周期介绍:
- 线程的生命周期:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。
- 当线程对象调用了
start()
方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。 - 启动线程使用
start()
方法,而不是run()
方法。 - 只能对处于新建状态的线程调用
start()
,否则将引发IllegalThreadStateException
异常。 - 所有现代的桌面和服务器操作系统都采用抢占式调度策略,只有当一个线程调用了它的
sleep()
方法或yield()
方法后才会放弃所占用的资源。 - 线程从阻塞状态只能进入就绪状态,无法进入运行状态。
- 程序会以如下三种方式结束,结束后就处于死亡状态。
run()
或call()
方法执行完成,线程正常结束。- 线程抛出一个未捕获的
Exception
或Error
。 - 直接调用该线程的
stop()
方法来结束该线程——该方法容易导致死锁,通常不推荐使用。
isAlive()
方法测试某个线程是否已经死亡。
代码演示:
1.MyThread.java:
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程开始执行:" + this.isAlive());
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程马上结束:" + this.isAlive());
}
}
2.Test.java:
public class Test {
public static void main(String[] args) throws InterruptedException {
MyThread mt = new MyThread();
System.out.println("线程对象已被创建,但是没有start:" + mt.isAlive());
mt.start();
Thread.sleep(3000);
System.out.println("子线程休眠中:" + mt.isAlive());
Thread.sleep(10000);
System.out.println("子线程执行结束:" + mt.isAlive());
}
}
运行结果:
线程对象已被创建,但是没有start:false
线程开始执行:true
子线程休眠中:true
线程马上结束:true
子线程执行结束:false