2013-05-02 152 views
3

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

可能有人向我提供的概念(任何链接)回答?感谢预期。

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

'System.out.println(Thread.activeCount());''''或'Thread.getAllStackTraces()' – NINCOMPOOP 2013-05-02 14:53:10

回答

12

由于您的简单程序不会显式创建线程,因此只会在此处创建一个应用程序线程。这是面试时的“正确”简短回答。

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

+0

非常感谢你@Alex。 – user1635014 2013-05-07 02:58:31

6

如果问题是字面上:

在下面的代码片段,多少个线程被创造出来的?

...然后答案是。代码片段不会自行创建任何线程。当然,一个线程获取该代码在运行中创建,并自该代码不会产生任何更多的,另一种明智的答案是1,但如果你在谈论有多少线程VM使用,然后(通常)至少需要两个(对于GC),大部分时间更多(调度程序,参考处理程序,终结器等),但完全依赖于配置。即使这样,它不会永远是两个,你可以有一个完美的贴合JVM不会在所有做垃圾收集(实际上早JavaCard的VM的正是这一点做到了。)

当然,这假设面试官在询问Java线程 - 如果我们进入操作系统级别,那么我们又有一个未知数,就是系统如何打印上面的字符串,如果有的话!

鉴于上述情况,我的反应往往是澄清究竟面试官对这个问题的意思 - 因为在其本身,它是一个有点暧昧,而不是一个很大的问题都在我看来。它看起来像一个诡计的问题,但没有足够的信息来正确回答 - 无论你给出的答案是什么,没有进一步的澄清,都可能被认为是不正确的。尽管NoobUnchained已经发布,但提及您可以使用Thread.activeCount()来获取正在使用的VM线程数量并不会违背您的要求。

当然,也许这个问题的目的与其说是一个技术的答案,但就看你会在接受采访时澄清它究竟是什么意思了 - 不是闻所未闻战术!

0

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

Signal Dispatcher 
main 
Finalizer 
Reference Handler 
Monitor Ctrl-Break 

它可以依赖于JVM和它的配置。

+2

@JunaidHassan鉴于问题中缺乏信息,“我不知道”实际上可以说是您能给出的最准确的答案。 – berry120 2013-05-02 15:10:59

+1

@JunaidHassan为什么不呢?当你无法回答时,什么是正确的答案? – NeplatnyUdaj 2013-05-02 15:11:07

2

当程序运行时,有我们创建了正在运行的线程。在你的情况下,这是一个简单的程序,然后有一个主线程它执行主要方法。也可能有几个守护线程JVM(即可能是垃圾收集器等)运行。

0

这一切都取决于您尝试计算哪个线程。有两种类型的线程由JVM创建,一个是应用程序级线程,另一个是系统级线程。

所以ATLEAST一个线程被创建这是主线程和多线程系统如内存管理(垃圾收集)等

如果你把你的例如仅创建1个应用程序级的线程是代码主线程。代码本身不会创建更多的线程。

因此,一个准确的答案将是1级应用程序级的线程(主线程)和许多系统级线程

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

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

多线程执行是Java平台的基本功能。如果您计算“系统”线程来执行内存管理和信号处理等操作,那么每个应用程序至少有一个或多个线程。但是从应用程序员的角度来看,你只需要一个叫做主线程的线程。这个线程有能力创建额外的线程,我们将在下一节中演示。