Java线程的底层实现、调度、状态转换

线程是CPU调度的基本单位,线程可以把一个进程的资源分配与执行调度分开,各线程共享进程资源,独立调度。

一、线程的实现【通常说的Java线程是基于内核线程的轻量级进程来实现的】
1、使用内核线程实现
1.1 内核线程
 1)内核线程是直接由操作系统内核支持的线程,由内核完成线程切换。
 2)内核通过线程调度器(Scheduler)对线程调度并负责将线程的任务映射到各个处理器上。
 3)每个内核线程(Kernel Level Thread)是内核的一个分身,支持多线程的内核叫多线程内核(Multi-Threads Kernel)
1.2 轻量级进程【通常意义所讲的线程】
 轻量级进程是内核线程的一种高级接口,只有先支持内核线程,才能有轻量级进程。

1.3 轻量级进程的局限性
 1)轻量级进程基于内核线程实现,线程操作需要进行系统调用,而系统调用需要再用户态和内核态来回切换,调用代价高。
 2)轻量级进程需要内核线程支持,要消耗一定内核资源(内核栈空间),因此系统支持轻量级进程的数量有限。

2、使用用户线程实现 【不支持多线程的操作系统DOS使用用户线程实现多线程】
1)建立在用户空间的线程库上,系统内核不能感知线程存在。
2)用户线程的建立、同步、销毁、调度,在用户态中完成,不需要内核的帮助,程序实现得当,线程不需要切换到内核态
 因此操作快速低耗,可以支持规模更大的线程数量。
3)优势:不需要系统内核支援   
4)劣势:线程操作需要程序自己处理,实现复杂。难以使用内核提供的线程调度及处理器映射。

3、使用用户线程加轻量级进程混合实现 【Unix系列操作系统】
1)将内核线程与用户线程一起使用,既存在用户线程,也存在轻量级进程。
2)其中的轻量级进程作为用户线程和内核线程之间的桥梁,从而使用内核提供的线程调度及处理器映射
4、Java线程的实现
1)JDK1.2 之前,使用用户线程实现,1.2 之后线程模型基于操作系统原生线程实现。
2)Windows、Linux版都是使用基于内核线程的轻量级进程来实现线程

二、Java线程调度
线程调度:系统为线程分配处理器使用权的过程。
1)协同式线程调度【lua的协同例程】
线程的执行时间由线程本身来控制,线程执行完之后要主动通知系统切换到另一个线程。
2)抢占式线程调度【Java的线程调度】
每个线程由系统分配执行时间,线程切换不由线程本身决定(Thread.yield()可以让出时间,但是无法获取执行时间)
线程执行时间由系统控制,程序只能通过设置线程优先级建议系统给线程分配不同时间。
3)线程优先级不可靠,Java的线程是通过映射系统的原生线程来实现,线程调度最终取决于操作系统。

三、状态转换
Java定义了5种线程状态,一个启动的线程在一个时间点只能存在其中一种状态。
1)New(新建): 创建后尚未启动的线程的状态。
2)Runable(运行): Runable包括了操作系统线程状态中的Running和Ready,此状态的线程可能正在运行,也可能正在等待CPU为它分配执行时间。
3)Waiting(无限期等待): 该状态的线程不会被分配CPU执行时间,要等待被其他线程显示的唤醒;
Object.wait()未设置Timeout参数; Thread.join()未设置Timeout参数;LockSupport.park()会让线程进入无限期等待状态。
4)Timed Waiting(限期等待): 该状态线程不会被分配CPU执行时间,不过无须等待被其他线程显示唤醒,一定时间后会有系统自动唤醒。
Thread.sleep(); Object.wait()设置了Timeout参数; Thread.join()设置了Timeout参数;LockSupport.parkNanos();LockSupport.parkUntil();
以上方法会让线程进入限期等待状态。
5)Blocked(阻塞): 阻塞状态在等待获取一个排它锁,这个事件将在另一个线程释放锁时发生。线程进入同步区域未获取到锁时进入这种状态。
6)Terminated(结束): 已终止线程的状态,线程已经结束执行。

猜你喜欢

转载自blog.csdn.net/u010577768/article/details/80179395