在说Java线程前,先说ucosii和linux两个操作系统。
Ucosii操作系统中的任务不能算是进程,因为它们运行在公共内存空间,任务并没有自己的私有内存空间,所以只能算是线程。ucosii对线程的管理(创建、删除、挂起、调度等)主要通过几个相关的函数来实现,这些函数基本上是围绕几个重要的数据结构展开操作的。在ucosii中,表示一个线程的实体是线程控制块,因此创建一个线程实则就是创建一个线程控制块。
Linux操作系统中的任务则算是进程,因为Linux中的每个任务都有自己的内存空间,其对应的程序代码就运行在这个归自己私有的内存空间,该空间通常又称为用户空间。Linux 管理进程的方式和ucosii管理线程的方式有相似之处,如进程控制块,但是在进程调度方面则与ucosii的任务调度大不相同。在linux中,表示一个进程的实体是进程控制块,因此创建一个进程实则就是要创建一个进程控制块。
再来说Java中的线程。Java管理线程的方式和ucosii管理线程的方式直观上看上去不太一样。在Java源代码中,Java语言只提供了一个Thread类,如何创建线程以及其他对线程的操作全在这个类中。但是,Thread类中所有关键方法内部都调用了对应的native声明的方法,即JNI方法,这意味着Java的线程其实是基于操作系统的原生线程模型来实现的。Sun JDK中,它的windows版本和linux版本都使用一对一的线程模型实现,一条Java线程就映射到一条轻量级进程之中。再进一步讲,Java管理线程的方式其实本质上就是windows或linux管理进程的方式。
最后,说说JVM。一个Java应用程序本质上是一个JVM进程。Java代码只有被编译成字节码后,才能被JVM识别和执行。JVM好比公路上行驶的货车,不同的Java应用程序好比货车里装了不同的货,但是所有在公路上行驶的货车无论外观还是内部结构都是一模一样的,也就是说不同Java应用程序使用的JVM是一样的。JVM中有专门用来管理线程的虚拟机栈和管理native方法的本地方法栈。可以这么说,用Java语言编写的线程相关操作的Java代码被编译成字节码,字节码中与线程相关的代码最终通过JNI交由操作系统来实现了线程的有关操作。所谓的Java线程类追究到底不过是对操作系统中的轻量级进程的再次包装。