一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线程。而一个Java程序的运行就算是没有用户自己开启的线程,实际也有很多JVM自启动的线程,请看下面的例子:
//只有一个main方法的程序有多个
public class OnlyMain {
public static void main(String[] args) {
//Java虚拟机系统系统的管理接口
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
//不需要获取同步的monitor和synchronizer信息,仅仅获取线程和线程堆栈信息
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
for (ThreadInfo threadInfo : threadInfos) {
System.out.println("{" + threadInfo.getThreadId() + "}" + threadInfo.getThreadName());
}
}
}
运行结果:
运行结果分析:
[6]MonitorCtrl-Break//监控Ctrl-Break中断信号的
[5]AttachListener//内存dump,线程dump,类信息统计,获取系统属性等[4]SignalDispatcher
//分发处理发送给JVM信号的线程
[3]Finalizer//调用对象finalize方法的线程
[2]ReferenceHandler//清除Reference的线程
[1]main//main线程,用户程序入口
尽管这些线程根据不同的JDK版本会有差异,但是依然证明了Java程序天生就是多线程的