JAVA 多进程与多线程的概念

版权声明:本文为博主原创文章,请尊重个人劳动成果,转载注明地址:http://blog.csdn.net/evan_man 谢谢! https://blog.csdn.net/evan_man/article/details/50804826

多进程

    Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。一个JVM进程对应一个JAVA程序。一个java的应用程序对应于一个JVM实例,当一个java程序运行的时候,一个jvm实例就诞生了,为了验证我们的说法,我进行了以下小小的例子来验证我的说法:

app1:
public class Test1 {
public static void main(String[] args) throws InterruptedException {
    while (true) {
        System.out.println("application 1");
        Thread.sleep(1000);
    }
}
}
app2:
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)
    • 即上面的结合体;
    • 具备了用户线程的:系统调度代价低,支持大规模用户线程并发的功能
    • 有具备了内核线程:任务调用,解决线程间阻塞问题
    • 评价:可以说是一种比较折衷的方法;

                    Uthread2.JPG




Reference:

http://blog.sina.com.cn/s/blog_ac843e3301016j5p.html

http://blog.csdn.net/wangxingbao4227/article/details/6758880

《深入理解Java虚拟机》


展开阅读全文

没有更多推荐了,返回首页