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

原创 2016年05月30日 21:08:54


        当线程被创建并启动以后,它既不是已启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(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不会空闲,它会去执行另一个处于就绪状态的线程,这样就可以让子线程立即开始执行。






版权声明:本文为博主原创文章,未经博主允许不得转载。

Java线程的生命周期

Java线程的生命周期作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs对于多线程编程而言,理解线程的生命周期非常重要,本文...
  • chszs
  • chszs
  • 2015年11月26日 16:53
  • 1856

java多线程(三)、线程的生命周期(状态)和线程的操作

三、线程的生命周期(状态)和线程操作 (一)线程的生命周期(状态)                                                                ...
  • wjtyy
  • wjtyy
  • 2015年05月31日 16:12
  • 1553

(2.1.2.2)Java多线程(二)、线程的生命周期和状态控制

一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用sta...
  • fei20121106
  • fei20121106
  • 2015年04月08日 14:28
  • 523

Java多线程、线程的生命周期和状态控制

Java多线程(二)、线程的生命周期和状态控制 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新...
  • zh521zh
  • zh521zh
  • 2015年12月09日 22:31
  • 3562

Thread、Runnable以及线程的生命周期

首先 Thread是类,Runable是接口。 线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法, 我们普通的RUN方法如果没有执行完是不会返回的,也...
  • rabbit_in_android
  • rabbit_in_android
  • 2015年11月21日 14:54
  • 3271

线程的生命周期以及控制线程

一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用sta...
  • miss_dongangel
  • miss_dongangel
  • 2016年04月20日 00:02
  • 2751

java多线程Thread的实现方法、中断机制、生命周期、守护进程等

二、初识Thread本部分主要介绍Java Thread基础知识1. 线程的实现方法在进行java多线程编写时,我们知道是通过java中的Thread进行实现的。那在实现Thread时,有哪几种方法可...
  • Snail_Ren
  • Snail_Ren
  • 2016年07月20日 16:16
  • 777

Linux多线程基础学习(三)线程生命周期

初始线程/主线程   1、当c程序运行时,首先运行main函数。在线程代码中,这个特殊的执行流被称作初始线程或者主线程。你可以在初始线程中做任何普通线程可以做的事情。 2、主线程的特殊性在于,它在ma...
  • laihonghuan
  • laihonghuan
  • 2015年10月13日 21:34
  • 949

关于进程、线程生命周期的总结

在操作系统里,有进程的运行状态与线程的运行状态; 进程的三种基本状态 实际系统中,为了管理的需要,还存在着另外两种状态:创建状态和终止状态。 进程的五种基本状态...
  • amosilin
  • amosilin
  • 2016年04月06日 23:08
  • 867

并发编程(4)线程的生命周期及基本状态

线程从创建到最终的消亡,要经历若干个状态,一般来说,线程包括以下这几个状态:新建(new),可运行(runnable),运行(running),阻塞(blocked),死亡(dead)。 先来一张经典...
  • u012170724
  • u012170724
  • 2016年03月24日 16:04
  • 448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 之 线程的生命周期(一)
举报原因:
原因补充:

(最多只允许输入30个字)