在一次采访中,我遇到了关于线程的查询。问题在下面的代码片段中,正在创建多少个线程? 我知道这似乎是非常基本的查询。但我找不到有证据的答案。
有人可以为我提供这个概念的答案(任何链接)吗?感谢期待。
class MainApp {
public static void main(String[] args) {
System.out.println("Welcome to Java");
}
}
在一次采访中,我遇到了关于线程的查询。问题在下面的代码片段中,正在创建多少个线程? 我知道这似乎是非常基本的查询。但我找不到有证据的答案。
有人可以为我提供这个概念的答案(任何链接)吗?感谢期待。
class MainApp {
public static void main(String[] args) {
System.out.println("Welcome to Java");
}
}
由于您的简单程序没有显式创建线程,因此这里只创建了一个应用程序线程。这是面试中“正确”的简短回答。
但是,您可以继续说 JVM 创建了它自己需要的其他线程。例如垃圾收集器 (GC) 线程。GC 线程数取决于配置。默认情况下 1。
如果问题是字面意思:
在下面的代码片段中,创建了多少个线程?
...那么答案是0。代码片段本身不会创建任何线程。当然,会为该代码创建一个线程以在其中运行,并且由于该代码不再创建,因此另一个明智的答案是 1。但是如果您谈论的是VM正在使用多少个线程,那么就是这样到(通常)至少是两个(对于 GC),大多数时候更多(调度程序、引用处理程序、终结器等),但完全取决于配置。即使那样,它也不总是两个,您可以拥有一个完全符合标准的 JVM,它根本不进行垃圾收集(实际上早期的 JavaCard VM 正是这样做的。)
当然,这假设面试官询问的是 Java 线程——如果我们深入到操作系统级别,那么对于系统究竟如何打印出上述字符串(如果有的话),我们还有一个更深层次的未知数!
鉴于上述情况,我的回答应该是澄清面试官这个问题的确切含义——因为就其本身而言,这有点模棱两可,在我看来根本不是一个好问题。它读起来像一个技巧问题,但没有足够的信息来正确回答它——无论你给出什么答案,如果没有进一步澄清,都可能被认为是不正确的。尽管正如 NoobUnchained 已经发布的那样,提到您可以使用Thread.activeCount()
来获取正在使用的 VM 线程的数量不会对您不利。
当然,也许这个问题的目的不是技术性的回答,而是看看你是否会在面试时澄清它的确切含义——这不是闻所未闻的策略!
当程序运行时,我们创建的线程正在运行。在您的情况下,它是一个简单的程序,然后有一个执行main 方法的主线程。此外, JVM运行的守护线程可能很少(即垃圾收集器等等)。
正确答案是“我不知道”我创建了这些线程:
Signal Dispatcher
main
Finalizer
Reference Handler
Monitor Ctrl-Break
它可以取决于 jvm 及其配置。
这完全取决于您要计算的线程。JVM创建了两种类型的线程,一种是应用程序级线程,另一种是系统级线程。
因此,至少创建了一个线程,即主线程和许多系统线程,例如用于内存管理(垃圾收集)等。
如果您以代码为例,则仅创建 1 个应用程序级线程,即主线程。并且代码本身不会创建更多线程。
所以一个精确的答案将是 1 个应用程序级线程(主线程)和许多系统级线程
阅读以下从 Java 文档复制的参考:
http://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html
多线程执行是 Java 平台的一个基本特性。每个应用程序至少有一个线程——或者多个,如果你算上“系统”线程来执行诸如内存管理和信号处理之类的事情的话。但是从应用程序程序员的角度来看,您只从一个线程开始,称为主线程。这个线程能够创建额外的线程,我们将在下一节中演示。