当我们在使用java编程的时候只启动了一个main方法,在我以前的认知中就是开启了一个主线程,就没有其它的了。但是真的是只有main 线程吗?
/**
* @author charles
* @date 2020/5/2 12:29
* @desc 启动一个main方法 实际上只是启动了一个 main线程吗
*/
public static void main(String[] args) throws Exception {
//JAVA 虚拟机线程系统的管理接口
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
//不需要获取同步的monitor 和Sychronizer信息, 仅仅获取线程和线程堆栈信息
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// 遍历线程信息 ,仅打印线程Id和线程名称信息
for (ThreadInfo threadInfo : threadInfos) {
System.out.println(threadInfo.getThreadId() + "--------" + threadInfo.getThreadName());
}
}
控制台打印结果:
解释说明执行结果
/**
* 执行结果:
* 6--------Monitor Ctrl-Break // 监控 Ctrl-Break 中断信号
* 5--------Attach Listener // 内存 dump,线程dump 类信息统计, 获取系统属性等
* 4--------Signal Dispatcher // 分发处理发送给 JVM 信号的线程
* 3--------Finalizer // 调用finalize 方法的线程
* 2--------Reference Handler // 清除reference的线程
* 1--------main // main线程 ,用户程序入口
*/
由上面的执行结果可知: 虽然我们启动的时候可能只是一个main方法 ,但是 这个java进程 却执行了6个线程。说明只要是一个java进程启动,那么就会由多个线程被启用。
注意:
1.不是一定每个java main方法启动都是启动了6个线程 ,这个和JVM 版本,系统版本有关。
2.Finalizer 线程是一个守护线程,执行当前对象的 reference()方法(Object类中的方法),一般用于垃圾回收清理系统资源等。因为是守护线程,当主线程死掉时, Finalizer也会死掉,可能无法完成垃圾回收等动作。所以子类覆盖Object de reference() 方法清理垃圾等用的比较少。