3

在一次采访中,我遇到了关于线程的查询。问题在下面的代码片段中,正在创建多少个线程? 我知道这似乎是非常基本的查询。但我找不到有证据的答案。

有人可以为我提供这个概念的答案(任何链接)吗?感谢期待。

class MainApp {
    public static void main(String[] args) {
        System.out.println("Welcome to Java");
    }
}
4

5 回答 5

12

由于您的简单程序没有显式创建线程,因此这里只创建了一个应用程序线程。这是面试中“正确”的简短回答。

但是,您可以继续说 JVM 创建了它自己需要的其他线程。例如垃圾收集器 (GC) 线程。GC 线程数取决于配置。默认情况下 1。

于 2013-05-02T14:53:57.320 回答
6

如果问题是字面意思:

在下面的代码片段中,创建了多少个线程?

...那么答案是0。代码片段本身不会创建任何线程。当然,会为该代码创建一个线程以在其中运行,并且由于该代码不再创建,因此另一个明智的答案是 1。但是如果您谈论的是VM正在使用多少个线程,那么就是这样到(通常)至少是两个(对于 GC),大多数时候更多(调度程序、引用处理程序、终结器等),但完全取决于配置。即使那样,它也不总是两个,您可以拥有一个完全符合标准的 JVM,它根本不进行垃圾收集实际上早期的 JavaCard VM 正是这样做的。)

当然,这假设面试官询问的是 Java 线程——如果我们深入到操作系统级别,那么对于系统究竟如何打印出上述字符串(如果有的话),我们还有一个更深层次的未知数!

鉴于上述情况,我的回答应该是澄清面试官这个问题的确切含义——因为就其本身而言,这有点模棱两可,在我看来根本不是一个好问题。它读起来像一个技巧问题,但没有足够的信息来正确回答它——无论你给出什么答案,如果没有进一步澄清,都可能被认为是不正确的。尽管正如 NoobUnchained 已经发布的那样,提到您可以使用Thread.activeCount()来获取正在使用的 VM 线程的数量不会对您不利。

当然,也许这个问题的目的不是技术性的回答,而是看看你是否会在面试时澄清它的确切含义——这不是闻所未闻的策略!

于 2013-05-02T14:59:09.103 回答
2

当程序运行时,我们创建的线程正在运行。在您的情况下,它是一个简单的程序,然后有一个执行main 方法的主线程此外, JVM运行的守护线程可能很少(即垃圾收集器等等)。

于 2013-05-02T15:00:32.517 回答
0

正确答案是“我不知道”我创建了这些线程:

 Signal Dispatcher
 main
 Finalizer
 Reference Handler
 Monitor Ctrl-Break

它可以取决于 jvm 及其配置。

于 2013-05-02T14:59:52.883 回答
0

这完全取决于您要计算的线程。JVM创建了两种类型的线程,一种是应用程序级线程,另一种是系统级线程。

因此,至少创建了一个线程,即主线程和许多系统线程,例如用于内存管理(垃圾收集)等。

如果您以代码为例,则仅创建 1 个应用程序级线程,即主线程。并且代码本身不会创建更多线程。

所以一个精确的答案将是 1 个应用程序级线程(主线程)和许多系统级线程

阅读以下从 Java 文档复制的参考:

http://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html

多线程执行是 Java 平台的一个基本特性。每个应用程序至少有一个线程——或者多个,如果你算上“系统”线程来执行诸如内存管理和信号处理之类的事情的话。但是从应用程序程序员的角度来看,您只从一个线程开始,称为主线程。这个线程能够创建额外的线程,我们将在下一节中演示。

于 2013-05-02T16:18:07.770 回答