线程的生命周期:
A线程新建完成之后,会进入就绪状态。就绪阶段当拿到Cpu资源之后就会执行,进入运行阶段,运行过程中可能会被别的线程资源抢占,此时A线程进入阻塞状态,阻塞过程中抢占A线程的资源执行完毕了,把资源设置非占用状态,A线程就会开始抢资源并进入就绪状态,如果A线程得到处理器资源了,重新进入运行状态,让运行状态执行完run方法或者Call方法之后,就会进入死亡销毁状态。
阻塞状态,运行状态,就绪状态线程都可能进入死亡状态。
新建状态:创建线程对象,JVM为线程分配内存,初始化成员变量值。
就绪状态:有执行资格,但没执行权,JVM为线程创建方法栈和程序计数器,等待线程调度器调用
阻塞状态:没有执行资格,没有执行权,
线程调用sleep()方法,主动放弃CPU资源
线程调用了一个阻塞式IO方法,在该方法返回前,线程为阻塞状态
线程试图获得一个同步锁(同步监视器)在该同步锁正在被其他线程所持有
线程在等待某个通知(notify)
线程调用了Suspend方法将该线程挂起,但这个方法容易导致死锁,尽量避免使用该方法
运行状态:有执行权,执行资格,就绪状态的线程获取到CPU资源,开始运行run()方法,该线程进入运行状态,
Run()或者Call()方法执行结束后
线程抛出一个未捕获的exception或Error
调用线程stop方法结束线程,该方法容易导致死锁,不推荐使用。
死亡状态:对象变为垃圾等待回收
在main方法中new一个线程,将有俩个线程启动。一个是main方法,一个为当前线程。
同一个线程不能俩次start()方法,会抛出IllegalThreadStateException这个异常。