关闭

Java 之 线程的生命周期(一)

标签: java线程
342人阅读 评论(2) 收藏 举报
分类:


        当线程被创建并启动以后,它既不是已启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直“霸占”这CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、就绪之间切换。


新建和就绪状态

        当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。


        当线程对象调用了start方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程合适开始运行,取决于JVM里线程调度器的调度。


        启动线程使用start方法,而不是run方法!永远不要调用线程的run方法!调用start方法来启动线程,系统会把该run方法当成线程执行体来处理;但如果直接调用线程对象的run方法,则run方法立即就会被执行,而且在run方法返回之前其他线程无法并发执行--也就是说,如果直接调用线程对象的run方法,系统把线程对象当成一个普通对象,而run方法也是一个普通方法,而不是线程执行体。


public class FourthThread extends Thread {

	private int i;
	
	//重写run方法,run方法的方法体就是线程执行体
	public void run(){
		for ( ; i < 10; i++) {
			//直接调用run方法时,Thread的this.getName()返回的是该对象的名字
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}
	
	public static void main(String[] args)throws Exception{
		for (int i=0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
			
			if (i==5) {
				//直接调用线程对象的run方法
				//系统会把线程对象当成普通对象,把run方法当成普通方法
				//所以下面两行代码并不会启动两个线程,而是一次执行两个run方法
				new FourthThread().run();
				new FourthThread().run();
			}
		}
	}
}




        启动线程的正确方法时调用Thread对象的start方法,而不是直接调用run方法,否则就变成单线程程序了。调用了线程的run方法之后,该线程已经不再处于新建状态,不要再次调用线程对象的start方法(只能对处于新疆状态的线程调用start的方法,否则将引发IllegalThreadStateException异常)。调用线程对象的start方法之后,该线程立即进入就绪状态--就绪状态相当于“等待执行”,但该线程并未真正进入运行状态。


        如果希望调用子线程的start方法后子线程就立即开始执行,程序可以使用Thread.sleep(1)来让当前运行的线程(主线程)睡眠1毫秒,因为在这1毫秒内CPU不会空闲,它会去执行另一个处于就绪状态的线程,这样就可以让子线程立即开始执行。






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场