Java中main()方法和主线程有啥关系?

Posted

技术标签:

【中文标题】Java中main()方法和主线程有啥关系?【英文标题】:What is the relation between the main() method and main thread in Java?Java中main()方法和主线程有什么关系? 【发布时间】:2013-07-14 04:45:19 【问题描述】:

我的导师告诉我主线程是每个线程的父线程,但他无法解释原因。

当我写一个简单的程序时:

Class A

然后它在执行的时候抛出异常:

java.lang.NoSuchMethodError: main Exception in thread "main"

main()方法和主线程有什么关系吗?

【问题讨论】:

你的导师错了。 Java线程之间没有父子关系。 当然,thread main是应用程序的开始,JVM创建一个thread(main)并通过它调用静态main类 @EJP:“错误”很苛刻。虽然线程不具有这种关系,但可以说所有用户线程都是从主线程(直接或间接)产生的。 @EJP 我同意你他不是写的,没有父子线程的概念。但是我能做些什么来证明他在 Main is Parent Thread 是不正确的 @Thilo 不,“错误”是正确的, 并且根据 OP,导师说'每个线程的父',而不仅仅是'所有用户线程'。兄弟姐妹之间不能有父子关系。 【参考方案1】:

main() 方法和主线程之间有什么关系吗?

当 JVM 启动时,它会创建一个名为“Main”的线程。您的程序将在此线程上运行,除非您自己创建其他线程。

“主”线程所做的第一件事是查找您的static void main(String[] argv) 方法并调用它。这是您的程序的入口点。

如果您希望事情“同时”发生,您可以创建多个线程,并让每个线程执行某些操作。然后他们将继续同时做这些事情。 JVM 还创建了一些内部线程用于后台工作,例如垃圾收集。

【讨论】:

如果第一件事 "Main" 线程做的是搜索static void main(String args[]) 那么静态块怎么会先运行。 这就是类加载的工作原理。尝试在新类上调用方法,它将加载该类并对其进行初始化(包括运行静态初始化程序块)。那里的“主要”没什么特别的。 @java_begin - 没有main方法,你不能运行程序,所以没有静态执行。 @Java_begins 当您尝试运行一个类时,该类必须具有static void main(String[]) 方法。 静态块(如果类有一个)将首先执行,但除非 main() 方法存在,否则它根本不会执行。我猜你可以说“Main”线程首先验证 main() 方法的存在,然后初始化类。正如@Thilo 所说,这涉及执行静态块。加载类后,将执行 main() 方法。【参考方案2】:

首先Main Thread is a parent thread of every thread 是模棱两可的。与Process 不同,Java 线程中没有父子概念。你确实有ThreadGroups 来对线程进行分组,然后有子组,但它与Process 的不同之处在于,如果父级死了,子级仍然存在。

main 线程是启动程序的线程,或者只是运行public static void main(String... args) 方法的线程。

【讨论】:

以上是关于Java中main()方法和主线程有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以区分主线程和它产生的任何线程吗?

关于类加载线程 和主线程是否是一个线程的疑问

在后台和主线程中使用托管对象上下文

“阻塞”主线程(dispatch_get_main_queue())和(或不)定期运行 currentRunLoop - 有啥区别?

Android Handler相关面试题你能答对多少?子线程和主线程是如何切换的?

全局异步和主线程异步区别改变PlaceHolder颜色解决键盘弹起挡住文本框问题