在java中,启动一个简单的main程序,并非只是单单建立了一个main线程而已,JVM会自动建立一些辅助用的线程,主要有如下几个:java
Attach Listener:Attach Listener线程是负责接收到外部的命令,而对该命令进行执行的而且吧结果返回给发送者。一般咱们会用一些命令去要求jvm给咱们一些反 馈信 息,如:java -version、jmap、jstack等等。若是该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,获得启动。linux
Signal Dispatcher:前面咱们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不一样的模块处理命令,而且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工做。windows
Finalizer:这个线程也是在main线程以后建立的,其优先级为10,主要用于在垃圾收集前,调用对象的finalize()方法;多线程
Reference Handler:VM在建立main线程后就建立Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象自己(软引用、弱引用、虚引用)的垃圾回收问题。oracle
以上这部份内容引用自 http://ifeve.com/jvm-thread/,能够取这个地址查看更多线程的信息app
这4个线程,加上,main,因此总共会有5个线程被建立,能够经过这几行代码来查看jvm
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();ide
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false);spa
for (ThreadInfo info : threadInfos ) {线程
System.out.println("[" + info.getThreadId() + "]" + info.getThreadName());
}
可是,当前活动的线程只有1个,就是main,System.out.println(Thread.activeCount()); 用这条命令返回值是1。这也常常被用做如下场合的判断
好比,在main线程中建立多个子线程后,若是子线程的耗时比main线程要长,main线程就会再子线程以前结束。假如main线程的结果须要用到子线程的返回值,那么咱们一般就在main线程中加上这句代码:
System.out.println(Thread.activeCount() >1),
来判断子线程是否所有运行结束,也就是当前活动线程只有main线程一个。这样作在windows下是没错的,可是!!!
在linux下就不是这样了,你会发现,即便全部的子线程所有结束,打印当前的活动线程是2!!!而不是1,除了main线程以外,linux下还会有一个Monitor Ctrl-Break 线程存在,这个线程是用来干吗的呢?
Monitoring Thread Activity With Thread Dumps Thread dumps, or "thread stack traces," reveal information about an application's activity that can help you diagnose problems and better optimize application and JVM performance; for example, thread dumps can show the occurrence of "deadlock" conditions, which can seriously impact application performance. You can create a thread dump by invoking a control break (usually by pressing Ctrl-Break or Ctrl-\ or SIGQUIT on linux). This section provides information on working with thread dumps. It includes information on these subjects: 1.Lock Information in Thread Dumps 2.Detecting Deadlocks
这是oracle官网的原话。你们能够自行翻译。 结论:在windows下能够用 Thread.activeCount() >1来判断子线程是否所有结束,可是linux中应该是 Thread.activeCount() > 2