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 - 有啥区别?