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