线程

线程的生命周期

所谓的xx生命周期,其实就是某对象的包含产生和销毁的一张状态图。线程的生命周期如下图所示:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:451.5pt; height:153.75pt'> <v:imagedata src="file:///G:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" o:href="http://images.cnblogs.com/cnblogs_com/holbrook/thread_state.jpg" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

各状态的说明如下:
<!--[if !supportLists]-->·         <!--[endif]-->New新建。新创建的线程经过初始化后,进入Runnable状态。
<!--[if !supportLists]-->·         <!--[endif]-->Runnable就绪。等待线程调度。调度后进入运行状态。
<!--[if !supportLists]-->·         <!--[endif]-->Running运行。
<!--[if !supportLists]-->·         <!--[endif]-->Blocked阻塞。暂停运行,解除阻塞后进入Runnable状态重新等待调度。
<!--[if !supportLists]-->·         <!--[endif]-->Dead消亡。线程方法执行完毕返回或者异常终止。
可能有3种情况从Running进入Blocked
<!--[if !supportLists]-->·         <!--[endif]-->同步:线程中获取同步锁,但是资源已经被其他线程锁定时,进入Locked状态,直到该资源可获取(获取的顺序由Lock队列控制)
<!--[if !supportLists]-->·         <!--[endif]-->睡眠:线程运行sleep()join()方法后,线程进入Sleeping状态。区别在于sleep等待固定的时间,而join是等待子线程执行完。当然join也可以指定一个超时时间。从语义上来说,如果两个线程a,b, a中调用b.join(),相当于合并(join)成一个线程。最常见的情况是在主线程中join所有的子线程。
<!--[if !supportLists]-->·         <!--[endif]-->等待:线程中执行wait()方法后,线程进入Waiting状态,等待其他线程的通知(notify)。

线程的类型

<!--[if !supportLists]-->·         <!--[endif]-->主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread)。每个进程至少都有一个主线程,主线程通常最后关闭。
<!--[if !supportLists]-->·         <!--[endif]-->子线程:在程序中创建的其他线程,相对于主线程来说就是这个主线程的子线程。
<!--[if !supportLists]-->·         <!--[endif]-->守护线程:daemon thread,对线程的一种标识。守护线程为其他线程提供服务,如JVM的垃圾回收线程。当剩下的全是守护线程时,进程退出。
<!--[if !supportLists]-->·         <!--[endif]-->前台线程:相对于守护线程的其他线程称为前台线程。
<!--[if !supportLists]-->·         <!--[endif]-->进程(process)是指在系统中正在运行的一个应用程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据和变量只属于它自己。
<!--[if !supportLists]-->·         <!--[endif]-->线程(thread)是进程内相对独立的可执行单元,所以也被称为轻量进程(lightweight processes);是操作系统进行任务调度的基本单元。它与父进程的其它线程共享该进程所拥有的全部代码空间和全局变量,但拥有独立的堆栈(即局部变量对于线程来说是私有的)。
<!--[if !supportLists]-->·         <!--[endif]-->进程间通信其实是指分属于不同进程的线程之间的通讯,所以进程间的通信方法同样适用于线程间的通信。但对应归于同一进程的不同线程来说,使用全局变量进行通信效率会更高。因为WINDOWS运行的实体是线程, 狭义上的进程间通信其实是指分属于不同进程的线程之间的通讯.而单个进程之间的线程同步问题可归并为一种特殊的进程通信它要用到内核支持的系统调用来保持线程之间同步
<!--[if !supportLists]-->·         <!--[endif]-->调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销
<!--[if !supportLists]-->·         <!--[endif]-->进程和线程都具有就绪、阻塞和运行三种基本状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值