Thread线程的生命周期:
创建(new)
在Java程序中创建线程有几种方法。每个Java程序至少包含一个线程:主线程。其它线程都是通过Thread构造器或实
例化继承类Thread的类来创建的。在一个线程对新线程的Thread对象调用start()方法之前,这个新线程并没有真正
开始执行。
就绪(Runnable)
处于就绪状态的线程已经具备了运行条件,即已经启动了start()方法,但还没有分配到CPU,处于线程就绪队列,
等待系统为其分配CPU。这个过程成为cpu调度,线程对象一旦获得cpu就会进入运行状态。
运行(running)、阻塞(Blocked)
处于运行状态的线程开始执行run()方法。在运行状态中有很多种线程状态之间切换的情况,所以此状态也是线程
生命周期中最复杂的一个状态。
当发生如下情况线程会进入阻塞状态:
①、线程调用sleep()方法主动放弃所占用的系统资源
②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有
④、线程在等待某个通知(notify())
被阻塞的线程会在如下情况下进入就绪状态(重新被激活):
①、sleep()方法睡眠时间已到
②、等待的其他线程或程序持有的“锁”已被释放
③、正在等待触发条件的线程,条件得到满足
死亡(Dead)
正常死亡:当线程的run()方法执行完毕
非正常死亡:被强制终止;线程抛出未捕获的异常或Error
在这里说一种线程被强制终止的方法:
}
线程的生命周期分为创建(new)、就绪(Runnable)、运行(running)、阻塞(Blocked)、死亡(Dead)五种状态
创建(new)
在Java程序中创建线程有几种方法。每个Java程序至少包含一个线程:主线程。其它线程都是通过Thread构造器或实
例化继承类Thread的类来创建的。在一个线程对新线程的Thread对象调用start()方法之前,这个新线程并没有真正
开始执行。
一般常用的两种构造方法:Thread();Thread(Runnable target)
就绪(Runnable)
处于就绪状态的线程已经具备了运行条件,即已经启动了start()方法,但还没有分配到CPU,处于线程就绪队列,
等待系统为其分配CPU。这个过程成为cpu调度,线程对象一旦获得cpu就会进入运行状态。
注意:线程一旦被启动就不能再启动,即不能再调用start()方法。
运行(running)、阻塞(Blocked)
处于运行状态的线程开始执行run()方法。在运行状态中有很多种线程状态之间切换的情况,所以此状态也是线程
生命周期中最复杂的一个状态。
当发生如下情况线程会进入阻塞状态:
①、线程调用sleep()方法主动放弃所占用的系统资源
②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有
④、线程在等待某个通知(notify())
被阻塞的线程会在如下情况下进入就绪状态(重新被激活):
①、sleep()方法睡眠时间已到
②、等待的其他线程或程序持有的“锁”已被释放
③、正在等待触发条件的线程,条件得到满足
④、等待的操作返回的线程,操作正确返回(wait())
死亡(Dead)
正常死亡:当线程的run()方法执行完毕
非正常死亡:被强制终止;线程抛出未捕获的异常或Error
在这里说一种线程被强制终止的方法:
在抛出的InterruptedException异常中加上break或return,然后调用interrupt()方法即可
catch (InterruptedException e) {
e.printStackTrace();
break;}