证明: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() 方法清理垃圾等用的比较少。

经验分享 程序员 微信小程序 职场和发展