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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值