菜鸟俺也不是新手了。最近碰到一个 问题:我的几个线程居然在tomcat被shutdown之后还在乱跑。所以才想起这个概念来。
java  com.myclass 这样是启动一个java进程,还是启动了一个java虚拟机?
java进程和java虚拟机之间是怎样的对应关系?
java程序中的线程是在java进程退出之后会自动被停止,还是要等java虚拟机退出后才会被终止?
怎样才能停止java虚拟机?比如在启动tomcat等服务器之后

解决方案 »

  1.   

    跑java不需要tomcat,tomcat是一个jsp容器;java  com.myclass 首先启动java虚拟机,然后在java虚拟机上运行一个或多个线程,相对操作系统来说,java虚拟机是一个java进程;java进程停止了,java虚拟机消失了。看java虚拟机是否运行,查看windows任务管理器,看java进程是否存在。如何关闭不用我所了吧。
      

  2.   

    JVM就是将class的字节码解释成bin的东西,每个操作系统有不同的JVM。
      

  3.   

    jvm和java进程是一对一的关系罗?
    为何linux机器上,运行tomcat的shutdown.sh后,web服务不能用了,但是我启动的java线程还在跑(在jsp代码里面启动的线程)?????
      

  4.   

    可以这样解释tomcat本身只是个容器
    他只是对应的一个线程,shutdown.sh只是关闭这个线程,而对其他的线程没有影响
      

  5.   

    tomcat绝对不是对应一个线程,它也是以java   它的主类   这样运行起来的.
      

  6.   

    public static void exit(int status)
    ---->Terminates the currently running Java Virtual Machine.
      

  7.   

    java  一次,就是启动一个java进程,也就是启动了一个jvm。但是不知到tomcat的停止脚本shutdown.sh是否终止了java进程,为何之后还有我的线程残留。
    tm d 公司那个机器是用于运营的,又不好再现当时的情况!
      

  8.   

    Java虚拟机就是一个翻译工具,把操作系统不认识的java的class文件翻译成操作系统认识的东东
    Java虚拟机也是一个平台,编译好的class在这个平台上运行
    tomCat和Java虚拟机概念差得很远
      

  9.   

    tomCat和Java虚拟机概念差得很远
    ----这是绝对的。但是不知到tomcat的停止脚本shutdown.sh是否终止了java进程之后,为何之后还有我的线程残留。这些线程是我的tomcat里的一个jsp页面里启动的
      

  10.   

    jvm 就是java虚拟机,在操作系统中,一个虚拟机对应一个进程(察看系统进程时可以看到java进程)。tomcat 是用java写成的,在jvm中跑,tomcat是jvm中一个线程;
    tomcat中运行着jsp,其实这些都是jvm中的线程,而jsp中启动的线程也是在jvm中运行(也是jvm的线程,和tomcat,jsp等同等地位)。如果jvm关闭,也就是java进程停止,那么里面的线程也将全部停止。然而需要说明的是,tomcat只是在jvm中的一个线程而已,所以关闭tomcat不一定关闭tomcat所在的jvm!(比如在关闭tomcat时发生异常,导致主动关闭jvm的代码没有运行到,那么这zhogn情况就会发生。)
    如果tomcat被关闭,而它所在的jvm没有关闭,那么有可能:敲入url访问,发现tomcat已经停止,但是先前由jsp启动的线程却在tomcat关闭之后还在跑!
      

  11.   

    线程启得多了,情况就复杂了,发生这种关了tomcat却没有关掉jvm的情况也就不奇怪了。
    很有可能是你的线程有问题。
    如果用到了jni,情况还要复杂!
    gz
      

  12.   

    shutdown.sh
    //Stop script for the CATALINA Server
    //仅仅是停止tomcat server的脚本jvm由java.exe启动,并伴随java.exe退出而停止,而跟是通过什么方式启动java.exe的没有关系(你可以直接用输入命令"java",也可以通过tomcat运行jsp启动等等,想想jsp是如何执行的,你就很清楚“为何之后还有我的线程残留”这个问题了)java程序可以用java.lang.Runtime.exit(int) 方法显式终止当前运行的jvm。