先说结论:main方法启动后,jvm会开启多个守护线程,但main方法中的代码是被单线程执行的。
上面的代码:以下代码使用java提供的线程管理类ThreadMXBean的dumpAllThreads方法返回所有活动线程的线程信息,并打印线程id和名称。
公共类测试{ publicstaticvoidmain (字符串[ ] args ) throwsinterruptedexception { threadmxbeanthreadmxbeanm=management for (threadinfo threadinfo : thread infos ) system.out.println(id: ) threadinfo.getthreadid () threadname3360 )
从运行结果中可以看到,在启动main方法后,将创建6个线程:Monitor Ctrl-Break、Attach Listener、Signal Dispatcher、Finalizer、Reference Handler、main,即使多次启动,其顺序也不会改变。
这些线程是什么?1、Monitor Ctrl-Break
Monitor Ctrl-Break是idea创建的监视线程,如果直接在javac上编译并运行,则没有此线程。 下图:2、Attach Listener
attach监听器线程的主要工作是一系列过程,过程步骤包括接收客户端命令、分析命令、搜索命令执行器和执行命令。
3、Signal Dispatcher
Signal Dispatcher线程将附着监听器线程接收到的命令分发给各种模块,并返回处理结果。
4、Finalizer
Finalizer线程主要处理JVM垃圾回收。
5、Reference Handler
参考处理程序线程的主要功能是处理pending链表中的引用对象,也是帮助JVM进行gc操作。
6、main
负责执行主线程,也就是main方法中的代码。
可以看到,除main线程以外的所有线程都是由jvm创建的守护程序线程,以确保java程序正常运行。
其实不仅仅是这些线程。 在调试模式下启动main方法时,执行结果如下。
在调试模式下运行main方法时,将添加三个符合JDWP协议的线程,以保证代码调试的正确性。 感兴趣的伴侣可以自己研究。
总之,main方法启动后,实际上就是jvm启动了。 jvm当然会创建多个线程来执行不同的任务。 main线程处理main方法中的代码,不存在多线程执行。
创作不易,你的点赞就是我输出的动力~