2013-05-02 151 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平臺的基本功能。如果您計算「系統」線程來執行內存管理和信號處理等操作,那麼每個應用程序至少有一個或多個線程。但是從應用程序員的角度來看,你只需要一個叫做主線程的線程。這個線程有能力創建額外的線程,我們將在下一節中演示。