
1.线程的生命周期
一个线程要经历如下几种状态:
新建
就绪
运行
阻塞
死亡
(1)新建和就绪状态
新建:当使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和普通Java对象易一样(没有表现出任何线程的动态特征),仅由Java虚拟机为其分配内存,并初始化其成员变量
就绪状态:当该线程调用了start()方法后(即启动线程),就处于就绪状态,此时Java虚拟机就为其创建方法调用栈、程序计数器,此时线程还没有开始运行,只是表示该线程可以运行了,至于何时运行就有JVM里的线程调度器的调度了,程序员是无法控制的
注意:
1.启动线程是调用start()方法,而不是调用run()。
2.如果直接调用run()方法,即会使run()变成普通方法,而非线程执行体。而且不能在run()方法里通过this.getName()来获取线程名字(此时的线程就是主线程main),须通过Thread.currentThread().getName()
3.直接调用run()方法不会启动另一个线程,即整个程序中只有一个主线程main,此时是程序是单线程程序。
4.只能对处于新建状态的线程调用start(),否则会引发IllegalThreadStateException异常。即直接调用run()之后,原来处于新建状态的线程就不会再处于新建状态了,此时再去调用start()方法就会引发此异常。
(2)运行和阻塞状态
运行:处于就绪状态的线程获得了CPU, 就开始执行run()方法的线程执行体,此时线程处于运行状态
阻塞:当线程在运行过程中被中断时,线程会进入阻塞状态
这里能使运行状态进入阻塞状态的情况:
1.线程调用sleep(long millis)方法,即线程主动放弃处理器的资源
2.线程调用了一个阻塞式IO方法,再该方法返回之前,线程被阻塞
3.线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。
4.线程在等待某个通知(notify)
5.程序调用了线程的suspend()方法将该线程挂起。(该方法易造成死锁,尽量避免使用)
处于阻塞状态的线程会在某个合适的时机进入就绪状态(不是运行状态哦)。
使处于阻塞状态的线程进入就绪的情况:
1.调用sleep()方法到时了
2.线程调用的阻塞式IO方法已返回
3.线程成功的获得了同步监视器
4.线程等待到了想要的通知
5.处于挂起状态的线程被调用了resume()恢复方法
(3)线程死亡
下面的情况会使运行中的线程死亡:
1.run()或call()方法执行完毕,线程正常结束
2.线程抛出一个未捕获的Exception或Error
3.直接调用线程的stop()方法来结束线程。(易造成死锁,慎用)
/***************************/
Thread类的方法
String getName(); //获取当前线程的名字
void start(); //启动线程
static void sleep(long millis); //是当前线程睡眠millis毫秒
void stop();
static void yield();
boolean isAlive();
void suspend();
void resume();
网友评论