多进程: Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。一个JVM进程对应一个JAVA程序。一个java的应用程序对应于一个JVM实例,当一个java程序运行的时候,一个jvm实例就诞生了,为了验证此说法,以下两个例子加以验证:
//Test1.java
public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            System.out.println("application 1");
            Thread.sleep(1000);
        }
    }
}
//Test2.java
public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            System.out.println("application 2");
            Thread.sleep(1000);
        }
    }
}
我们同时执行两个程序,当两个程序都运行的时候,我们打开windows的任务管理器,我们在程序中可以看到有两个java程序的实例: javaw.exe javaw.exe 当我们结束一个java程序的时候,其中的一个javaw.exe停止消失,说明了,每一个java程序对应一个jvm实例,都有自己的程序执行空间,每一个都有一套jvm虚拟机机制。 多线程:
  • Java线程的实现
    • Thread类和大部分的java API有显著的差别,它关键方法声明为native的,这意味着该方法没有或者无法使用平台无关的手段来实现!
    • 上面的问题表明,java线程的实现是依赖于线程的实现(操作系统);虚拟机只是将java的线程最终映射到操作系统的线程模型中,通过后者完成具体实现
    • 操作系统支持什么样的线程模型很大程度上决定了Java虚拟机的线程是怎么映射的
  • 线程的实现(操作系统)主要有3种方式:内核线程实现、用户线程实现、用户线程加轻量级进程实现
  • 内核线程(KLT):(1:1)
    • 直接由操作系统内核支持的线程,内核通过操纵调度器将线程的任务映射到各个处理器上
    • 程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(LWP),即平时所说的线程
    • 轻量级进程和内核线程是一种一对一的线程模型
    • 缺点:系统调用代价高,因为需要在用户态和内核态之间来回切换;轻量级进程数量有限,因为LWP和内核线程是一对一的关系
  • 用户线程(UT)(N:1)
    • 将线程的各种问题全部交给用户来解决,而且有时候无法通过代码解决一些问题;该实现基本已经被淘汰了
  • 用户线程and LWP(N:M)
    • 即上面的结合体;
    • 具备了用户线程的:系统调度代价低,支持大规模用户线程并发的功能
    • 有具备了内核线程:任务调用,解决线程间阻塞问题
    • 评价:可以说是一种比较折衷的方法