线程的实现
线程是CPU调度的基本单位,正如前面说的,一个进程的线程可以共享进程资源。也有自己独立的工作区间。在java中,Thread类的关键方法全是Native的。下面是实现线程的3种方式。
使用内核线程实现
内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过线程进行调度,负责将线程任务映射到各个处理器上,每个线程可以视为内核的一个分身,这样操作系统就有能力同时处理很多事情,支持多线程的内核叫多线程内核。但是程序一般不会直接使用内核线程,而是使用内核线程的高级接口,轻量级进程,每个轻量级进程都有一个内核线程支持,也是一对一的关系。但是这个轻量级线程是基于内核线程实现的,因此很浪费系统资源。
用户线程实现
一个线程不是内核线程那就是用户线程。狭义上来说就是建立在用户空间的线程库上,用户线程的建立,同步,销毁,调度完全在用户态执行。不需要内核的帮助,由于不需要切换到内核态,因此操作是快速且低消耗的,可以支持规模大的线程熟练。缺点是,没有内核的支援,线程的创建,切换,等都需要用户程序自己解决。
用户线程+轻量级线程混合
把上面的2个一起使用,线程还是创建在用户空间里面,而轻量级线程则作为用户线程和内核线程的桥梁。这样就可以使用内核提供的线程调度功能
java线程的实现
JDK1.2之前是用户线程实现的,1.2中线程魔性替换为基于操作系统原生线程模型。至于现在是什么模型,看虚拟机自身的实现。
java线程的调度
线程调度分为2种方式:协同式线程调度,抢占式线程调度。
协同式线程调度:线程的执行时间由线程本身来控制,线程自身的工作执行完了之后,要主动通知系统切换到另外一个线程上,优势是实现简单,而且线程执行完还要通知其他线程,切换操作对开发来说是可知的,所以没有线程同步问题,但是线程执行时间不可控制,如果一个线程代码有问题就会导致这个系统奔溃。
抢占式调度:每个线程由系统来分配执行时间,线程的切换不由本身决定,在这种调度下,线程的执行时间是系统控制的,不会存在一个线程一直阻塞而导致整个系统奔溃。
在java中,虽然线程调度是系统自动完成的,但是我们可以设置线程的优先级,但是这种优先级是不靠谱的,因为java线程的实现最终是通过映射到系统线程来实现的。优先级可能对应不上去。
java线程状态转换
请看前面章节有介绍