一、JAVA多线程的实现
多线程的实现主要以下三种模式:
1.内核线程实现
内核线程是指直接由操作系统内核支持的线程,这种线程由内核完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
程序一般不会直接使用内核线程吗,而是使用内核线程的一种高级接口,即轻量级线程,将轻量级线程与内核线程直接按照1:1的关系进行创建。具体的原理如图所示
在这种模型下,每个轻量级进程都成为一个独立的调度单元,即使其中一个轻量级进程阻塞了,也不会影响整个进程仅需工作,但创建轻量级进程的过程需要进行系统调用,即需要进行用户态和内核太的切换。每个轻量级进程都需要一个内核线程的支持,因此系统支持的轻量级进程的数量是有限的。
2.用户线程实现
用户线程完全建立在用户的线程库上,创建和销毁的过程中无需系统内核的参与,因此操作消耗的系统资源较少且效率较高,也能够支持规模更大的线程数量。
用户此案城的优点虽然很突出,但是缺点也很明显。比如阻塞处理等问题实现起来会非常困难,导致程序的代码实现起来非常复杂,除了有明确需求外,现在的操作系统已经不再使用它了。
3.混合实现
混合实现即为将内核线程实现和用户线程实现相结合的方式,在这种模式下,既存在用户线程,也存在着轻量级进行。用户线程还是完全创建在用户空间中,因此线程创建,销毁,切换等操作依然是廉价的,并且支持大规模用户线程并发,而操作系统支持的轻量级进程作为用户线程和内核线程切换的桥梁,这样可以使用内核提供的线程调度处理功能以及处理器映射,并且用户线程的系统调度要通过轻量级进程来完成,大大降低整个进程被完全阻塞的风险。
二、线程的状态
1.新建态(new):创建后尚未启动的线程。
2.就绪态(start):调用start后的线程,等待操作系统为其分配处理器执行时间
3.运行态(runnable):此时正在执行相关操作的线程
4.等待态(waited):处于这种状态的线程不会被分配处理器执行时间,它们要等到被其他线程唤醒。对应wait()或park()操作。
5.超时等待态(timed waited):处于这种状态的线程不会被分配处理器执行时间,它们要等到timeout设置的时间结束才会被唤醒。
6.阻塞(blocked):阻塞状态等待着获取一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生。
7.结束(terminated):已终止线程的状态,线程已经结束执行。
不同状态之间的关系可参考这幅图