1.2 java程序启动至少会启动几个线程

2016-07-26 22:26:39 12,231 1



一个Java程序启动至少启动几个线程?这是一个很常见的面试题。网上大部分的回答都是2个。以下截图来自百度知道:

QQ截图20160529020359.png


事实上,这个分析是没有错的。对于大部分人来说,对于Java中的垃圾回收机制都是有所了解的。不过这个答案只是回答了至少有几个,并没有回答到底有几个。要想弄明白到底有几个线程会被启动,最佳的方法是自己动手实践。

public class ThreadNumDemo {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean =ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos=threadMXBean.dumpAllThreads(false,false);
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println(threadInfo.getThreadId()+"-"+threadInfo.getThreadName());
        }
    }
}

这段代码的作用是打印出当前JVM中运行的所有线程信息,这使用到了JMX的API,读者不必关注,只要看运行的结果即可。

5-Attach Listener

4-Signal Dispatcher //分发处理发送给JVM信号的线程

3-Finalizer //调用对象的finalize方法的线程,就是垃圾回收的线程

2-Reference Handler //清除reference的线程

1-main //主线程

可以看到,当一个java进程启动的时候至少会开启以上的这些线程。不过需要注意的是,这是在JDK1.8中运行的结果,不同版本的JDK运行的结果可能会不同。

希望读者可以简单的记忆一下这些线程,毕竟面试的时候会被经常问到这个问题,如果你都能说出来,肯定会加分的。