默认情况下Java是单线程还是多线程?

默认情况下Java是单线程还是多线程?,java,multithreading,Java,Multithreading,我的应用程序中没有使用任何线程概念-默认情况下是单线程还是多线程?每个Java应用程序至少有两个线程(可能还有更多)。始终存在主线程或应用程序线程以及垃圾收集器线程。从技术上讲,每个Java应用程序都有相当多的线程(您可以使用jvisualvm进行检查)但从开发人员的角度来看,命令行应用程序是单线程的,除非您显式地创建更多线程或使用指定它可以在不同线程中运行的API调用。(例如) 应该特别提到这些调用的对象.finalize()方法,该方法说明: Java编程语言不保证哪个线程将调用任何给定对象

我的应用程序中没有使用任何线程概念-默认情况下是单线程还是多线程?

每个Java应用程序至少有两个线程(可能还有更多)。始终存在主线程或应用程序线程以及垃圾收集器线程。

从技术上讲,每个Java应用程序都有相当多的线程(您可以使用jvisualvm进行检查)但从开发人员的角度来看,命令行应用程序是单线程的,除非您显式地创建更多线程或使用指定它可以在不同线程中运行的API调用。(例如)

应该特别提到这些调用的
对象.finalize()
方法,该方法说明:

Java编程语言不保证哪个线程将调用任何给定对象的finalize方法。但是,可以保证调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。如果finalize方法引发了未捕获的异常,则该异常将被忽略,并且该对象的终结将终止

这可能是意外创建多线程应用程序的最简单方法。这也是强烈反对使用
finalize()
的原因之一,并且应该限制在非常特定的情况下,例如释放对象使用的本机资源


然而,AWT和Swing应用程序几乎总是以多线程方式结束,因此应该与它们一起使用。

和终结器,因此请使用这三种方式。@biziclop我认为finalize是在中调用的(至少在某些Java版本中)。3>2.我认为计算内部线程是不公平的。。但它确实添加了另一个透视图。@user2864740至少终结器线程并非完全是内部的:用户编写的代码正在其上执行。因此,无论何时实现终结器方法,您的代码库都会获得一段新代码,在终结器线程上执行。IDE调试器通常应该能够显示有多少线程正在运行。问题的意思是:,提供的两个选项之间有什么区别?为什么AWT/Swing应用程序本质上应该是多线程的?事实上,很多情况并非如此:除了次要的入口点代码之外,所有代码都发生在GUI线程中。@MarkoTopolnik,因为您总是至少有一个GUI线程和一个事件调度线程。您认为GUI线程到底是什么?人们通常将EDT称为GUI线程(这当然是我在上面所做的),所以我不确定您的意思。@MarkoTopolnik抱歉,您是对的,我把它与您可以从不同的线程调用
update()
这一事实混淆了,但这只会将绘制请求排在EDT中。尽管如此,线程安全性(或者说缺乏线程安全性)是AWT和Swing的一个重要方面,我将重新表述我的答案。@MarkoTopolnik@biziclop基本上是正确的,但命名错误的线程。Swing应用程序至少有两个线程运行用户代码:主线程和GUI线程(与EDT相同)。当前的最佳实践是,主线程只需调用
invokeLater
在EDT上完成所有GUI工作,避免所有线程安全和内存可见性问题,然后让主线程死掉。实际上,人们倾向于在主线上做其他事情。