Java笔记-多线程之线程生命周期

本文详细介绍了线程的生命周期,包括新建、就绪、运行、阻塞和死亡五种状态,解释了线程如何通过start()方法从新建状态变为就绪状态,并在JVM调度下开始运行。同时,讨论了线程的结束条件及isAlive()方法的使用。

线程生命周期


线程生命周期转换图:

这里写图片描述


线程生命周期介绍:

  1. 线程的生命周期:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。
  2. 当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。
  3. 启动线程使用start()方法,而不是run()方法。
  4. 只能对处于新建状态的线程调用start(),否则将引发IllegalThreadStateException异常。
  5. 所有现代的桌面和服务器操作系统都采用抢占式调度策略,只有当一个线程调用了它的sleep()方法或yield()方法后才会放弃所占用的资源。
  6. 线程从阻塞状态只能进入就绪状态,无法进入运行状态。
  7. 程序会以如下三种方式结束,结束后就处于死亡状态。
    • run()call()方法执行完成,线程正常结束。
    • 线程抛出一个未捕获的ExceptionError
    • 直接调用该线程的stop()方法来结束该线程——该方法容易导致死锁,通常不推荐使用。
  8. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值