Java多线程基础:Java与线程
Java多线程基础:Java与线程
线程的实现
使用内核线程实现
内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程。内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
程序不会直接使用内核线程,而是使用内核线程的一种高级接口——轻量级线程(LWP), 每个轻量级线程都有一个内核线程对应。就像下面这样:
每个轻量级进程都需要一个内核线程的支持,因此轻量级进程要消耗一定的内核资源,因此一个系统支持的轻量级进程的数量是有限的。
使用用户线程实现
首先我们要理解什么是用户线程
从广义上讲,一个线程只要不是内核线程就是用户线程,所以从广义上讲轻量级进程程也属于用户线程,但轻量级进程的实现始终是建立在内核之上的,许多操作都要进行系统调用,效率会受到限制。
从狭义上讲,一个线程完全建立在用户空间的线程库上,系统内核不感知线程的存在,即使用户线程。这种线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。
但是线程的创建、切换和调度都是需要考虑的问题,而且由于操作系统只把处理器资源分配给进程,那诸如"阻塞如何处理"、“多处理器系统中如何将线程映射到其他处理器上”这类问题解决起来将会异常困难,甚至不可能完成。因而使用用户线程实现的程序一般都比较复杂。Java也是浅尝辄止。
混合实现
混合实现,即将用户线程和轻量级进程结合起来,用户线程还是完全建立在用户空间中,因此用户线程的创建、切换、析构等依旧廉价,并且可以支持大规模的用户线程并发。而操作系统提供支持的轻量级进程则作为用户线程和内核线程之间的桥梁,这样可以使用内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级线程来完成,大大降低了整个进程被完全阻塞的风险。
Java线程的实现
JDK1.2之前使用了称为“绿色线程”的用户线程实现。JDK1.2中,使用了基于操作系统的远程线程模型来实现。
对于SunJDK来说,win和unix版都是一条Java线程映射到一条轻量级线程之中。
参考资料
- 《深入理解Java虚拟机》