当前位置:首页 > Java技术 > Java中main方法是单线程还是多线程?启动后有多少个线程会被创建?

Java中main方法是单线程还是多线程?启动后有多少个线程会被创建?

2022年11月09日 21:04:28Java技术9

先说结论:main方法启动后,jvm会开启多个守护线程,但main方法中的代码是被单线程执行的。

上代码:

下面这段代码通过java提供的线程管理类ThreadMXBean中的dumpAllThreads方法返回所有活动线程的线程信息,并打印线程id和名称:

public class Test {
     
    public static void main(String[] args) throws InterruptedException {
     
        ThreadMXBean threadMXBeanm = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBeanm.dumpAllThreads(false, false);
        for(ThreadInfo threadInfo : threadInfos){
     
            System.out.println("id:" + threadInfo.getThreadId() + " Thread Name :[" + threadInfo.getThreadName() + "]");
        }
    }
}

运行结果:
Java中main方法是单线程还是多线程?启动后有多少个线程会被创建? _ JavaClub全栈架构师技术笔记
从运行结果可以看出,当启动main方法后,创建了6个线程,分别是Monitor Ctrl-Break、Attach Listener、Signal Dispatcher、Finalizer、Reference Handler、main,多次启动后,顺序不变。

这些线程都是什么?

1、Monitor Ctrl-Break
Monitor Ctrl-Break是idea创建的一个监控线程,如果直接用javac编译执行,就不会有此线程,如下图:
Java中main方法是单线程还是多线程?启动后有多少个线程会被创建? _ JavaClub全栈架构师技术笔记
2、Attach Listener
Attach Listener 线程的主要工作是串流程,流程步骤包括:接收客户端命令、解析命令、查找命令执行器、执行命令等。

3、Signal Dispatcher
Signal Dispatcher线程负责将Attach Listener 线程接收的命令分发到各个不同的模块处理,并且返回处理结果。

4、Finalizer
Finalizer线程主要处理JVM垃圾回收。

5、Reference Handler
ReferenceHandler线程的主要功能是处理pending链表中的引用对象,也是协助JVM进行gc操作。

6、main
主线程,也就是负责执行main方法中的代码。

可以看出,除了main线程之外,其他线程都是jvm创建的守护线程,保证了java程序的正确运行。

其实不止这些线程:

当我们用debug模式启动main方法后,运行结果如下:
Java中main方法是单线程还是多线程?启动后有多少个线程会被创建? _ JavaClub全栈架构师技术笔记
当以调试模式运行main方法,会新增三个线程,这三个线程都是遵守JDWP协议,用于保证代码调试的正确性,感兴趣的小伙伴可以自己研究下。

结论

所以说,main方法启动后,实际上就是启动了jvm,jvm自然会创建多个线程负责执行不同的任务,main线程处理main方法中的代码,不存在多线程执行。

创作不易,你的点赞就是我输出的动力~

作者:MaYuKang
来源链接:https://blog.csdn.net/MaYuKang/article/details/121931517

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/69207.html

分享给朋友:

“Java中main方法是单线程还是多线程?启动后有多少个线程会被创建?” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

Java 并发核心机制

Java 并发核心机制

📦 本文以及示例源码已归档在 javacore 一、J.U.C 简介 Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。...

Java 内存模型

Java 内存模型

📦 本文以及示例源码已归档在 javacore Java 内存模型(Java Memory Model),简称 JMM。 JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。...

java之整数的分解可以理解为倒序输出

Scanner in=new Scanner(System.in); int number ; number=in.nextInt(); int result=0; do{ int diget=number%10;...

java比较语句常犯错误和三个数比较大小

1.忘了大括号 解决: 任何if else语句后面加大括号,哪怕只有一句 2.忘了分号 if后面不能有分号 3.代码分格 Scanner in=new Scanner(System.in); int x; int y; int z;...

java中将英尺换算为身高

java中将英尺换算为身高

直接上代码 如图所示便是身高的换算,你学到了吗?、 int foot; double inch; Scanner in=new Scanner(System.in); foot=in.nextInt(); inch=in.nextDouble...

编写高质量代码改善java程序的151个建议——[52

编写高质量代码改善java程序的151个建议——[52

原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks Although the world is full of...

JAVA的文件操作【转】

11.3 I/O类使用          由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择。因为文件是一种常见的数据源,而且读写文件也是程...

Java并发之AQS详解

Java并发之AQS详解

java、多线程、并发、AbstractQueuedSynchronized、AQS、Lock、Mutex、ReentrantLock、Semaphore、CountDownLatch、线程同步 一、概述   谈到并发,不得不谈ReentrantLock;而谈到...

狂神Java基础总结

狂神Java基础总结

Java基础 Java学习的正确打开方式 学习是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。 链接:https://blog.csdn.net/qq_44543508/article/details/102651841...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。