证明:java程序 是一个的多线程程序
当我们在使用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() 方法清理垃圾等用的比较少。
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
分享7 个开源项目管理工具