您的位置:首页 > 编程语言 > Java开发

JAVA多线程学习笔记<2>线程的生命周期与线程栈

2014-04-25 15:19 375 查看
【JAVA线程状态转换】

示意图:



1、new:线程对象已经创建,还没有在其上调用start()方法。

2、ready:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入ready状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到ready状态。

3、run:线程调度程序从处于ready状态中的线程选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

4、wait:这是线程有资格运行时它所处的状态。线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到ready状态。

5、dead:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

Thread类中和这几种状态相关的方法:

// 开始线程
public void start( );
public void run( );

// 挂起和唤醒线程
public void resume( );     // 不建议使用
public void suspend( );    // 不建议使用
public static void sleep(long millis);
public static void sleep(long millis, int nanos);

// 终止线程
public void stop( );       // 不建议使用
public void interrupt( );

// 得到线程状态
public boolean isAlive( );
public boolean isInterrupted( );
public static boolean interrupted( );

// join方法
public void join( ) throws InterruptedException;


那么示意图就可以标注为:



注意:

1、run()只是启动了ready与run的调度程序,而并不是控制两个状态转换的方法。

2、sleep()完成了进入wait和结束wait两个动作。

3、线程进入运行状态后,可以通过Thread类的isAlive方法来判断线程是否处于运行状态。

4、使用sleep和suspend所产生的效果类似,但sleep方法并不等同于suspend。它们之间最大的一个区别是可以在一个线程中通过suspend方法来挂起另外一个线程,而sleep只对当前正在执行的线程起作用,即在使用sleep时,不能在一个线程中来休眠另一个线程,只能休眠其本身。

5、在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted(),这两个方法的区别是interrupted用来判断当前线是否被中断,而isInterrupted可以用来判断其他线程是否被中断。因此,while (!isInterrupted())也可以换成while (!Thread.interrupted())。

【线程栈】

线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶。

线程栈的内容是随着程序运行动态变化的,如用下面的代码来分析栈的变化:



每个方法调用其他方法时,都把调用的方法压入‘当前线程’的栈顶,执行完后弹出,继续执行调用之前的方法。

【join方法】

这个方法的主要功能是保证线程的run方法完成后程序才继续运行。

当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。

如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。

从线程栈的角度来理解:

非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

如图:



reference:
http://lavasoft.blog.51cto.com/62575/99153 http://lavasoft.blog.51cto.com/62575/99152 http://www.blogjava.net/nokiaguy/archive/2009/03/11/259060.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: