并发不一定要依赖多线程(如PHP中的多进程并发),但在Java中,大多数都与线程脱不开关系。
线程的实现方式
线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。
Java提供了不同硬件和操作系统下对线程的统一处理,每个已经执行start()且还未结束的Java.lang.Thread类的实例就代表了一个线程。我们注意到Thread类与大部分的Java API不同,它的所有关键字都是声明为Native的(通常最高效率的手段也就是平台相关的手段)。
实现线程的主要方式有3种:使用内核线程实现、使用用户线程实现、使用用户线程实加轻量级进程现。
1)使用内核线程实现
内核线程(Kernel-Level Thread , KLT)就是直接由操作系统内核(Kernel,下称内核)支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持线程的内核就叫做多线程内核(Multi-Thread Kernel)。
程序一般不会直接使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Light Weight Process, LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。这种轻量级进程与内核线程之间1:1的关系成为一对一的线程模型。

优点:
由于内核线程的支持,每个轻量级进程都成为一个独立的调度单元,即使有一个轻量级进程在系统调用中阻塞了,也不会影响整个进程继续工作
缺点:
1.各种线程操作都需要系统调用,代价相对较高,需要在用户态和内核态切换
2.每个轻量级进程都爱要有一个内核线程支持,因此轻量级进程要消耗一定内核资源,因此一个系统支持轻量级进程的数量有限
2)使用用户线程实现
从广义上讲,一个线程只要不是内核线程,就可以认为是用户线程(User Thread,UT);从狭义上讲,用户线程指的是完全建立在用户空间的线程库上,系统内核不能告知线程存在的实现。
用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核帮助。因此操作可以是非常快速且低消耗的,也可以支持规模更大的线程数量,部分高性能数据库中的多线程就是由用户线程实现的。这种进程与用户线程之间1:N的关系称为一对多的线程模型。

优点:
不需要系统内核支援
缺点:
没有系统内核支援,所有的线程都要用户程序自己处理
应用:
除了不支持多线程的操作系统(如,DOS)中的多线程程序与少数特殊需求外,几乎没有应用
3)使用用户线程加轻量级进程实现
这种混合实现下,既存在用户线程,也存在轻量级进程。用户线程还是完全建立在用户空间中,因此用户线程的创建、切换、析构等操作依然廉价,并且可以支持大规模用户线程并发。而系统提供支持的轻量级进程可以提供线程调度功能及处理器映射,降低了阻塞风险。这种混合模式中,用户线程与轻量级进程的数量比是不定的,即N:M,这种就是多对多的线程模式。

应用:
许多UNIX系列操作系统,如Solaris、HO-UX
4)Java线程的实现
Java线程在jdk1.2之前,是基于称为“绿色线程”(Green Thread)的用户线程实现的,在jdk1.2中,线程模型替换为基于操作系统原生线程模型实现。