2013-10-21 56 views
0

我做一個Java過去的試卷,我覺得困惑的以下問題:如何確定Java線程的行爲

問:哪一個說法始終是真實的有關以下應用程序?

class HiPri extends Thread { 
    HiPri() { 
     setPriority(10); 
    } 

    public void run() { 
     System.out.println(「Another thread starting up.」); 
     while (true) { } 
    } 

    public static void main(String args[]) { 
     HiPri hp1 = new HiPri(); 
     HiPri hp2 = new HiPri(); 
     HiPri hp3 = new HiPri(); 
     hp1.start(); 
     hp2.start(); 
     hp3.start(); 
    } 
} 

答:當應用程序運行時,線程hp1將執行;線程hp2和hp3永遠不會得到 的CPU。

B.當應用程序運行時,線程hp1將執行完成,線程hp2將執行完成,然後線程hp3將執行完成。 C.運行應用程序時,所有三個線程(hp1,hp2和hp3)將同時執行,並在CPU中執行時間切片。

D.上述情況在所有情況下都不能保證發生。

我選擇D,因爲我認爲B和C都是可能的但不能保證發生。關鍵的答案是C然而。我在這裏錯過了什麼嗎?任何人都可以請澄清,對我?非常感謝。

+0

沒有與一個無限循環沒有完成。 –

回答

1

對我來說,關鍵是在回答A的措辭和B

... HP2和HP3將永遠獲得CPU。

這似乎是如果你同意所有的線程將啓動,那麼這是一個無效的答覆,因爲所有已收到至少有一些CPU。

...將執行到結束......

while (true) {}將永遠循環下去,這顯然讓這個假的。

通過淘汰的過程,只有答案'C'是有道理的。

編輯:正如在其他一些評論指出,回答將取決於如果假設搶佔式多線程。

1

B是不可能的,因爲每個線程必須做的工作量是無限的。

然而,要真正迂腐,該程序不是合法的Java,因爲它包含unreachable statements。所以人們可以爭辯說它可以做任何事情。

+1

@ user2864740我不相信需要Java實現來實現搶佔,所以A是可能的。 –

1

檢查the docs。所有3種方法立即返回,並開始一個新的Thread,由於run()方法體中的while(true)循環,該方法無限執行。

公共無效的start()

使該線程開始執行; Java虛擬機會調用此線程的運行方法。

結果是兩個線程同時運行:當前線程(從調用返回到start方法)和另一個線程(它執行其運行方法)。

這是從來沒有的法律,以啓動一個線程不止一次。特別是,線程一旦完成執行就不會重新啓動。

+0

那麼你的答案是什麼? – EJP

+0

@EJP我不認爲這是火箭科學連接「所有3種方法啓動一個線程無限運行」與答案C ... – TC1

+0

我不知道OP的能力,也沒有這些每個未來讀者的這個回答。你也不是。最好回答實際問題。 – EJP

0

在對選擇這裏你最好的答案應該是:

C.當應用程序運行時,所有三個線程(HP1,HP2,HP3和) 將同時執行,服用時間在CPU中切片。

但是線程調度在不同平臺上有所不同,取決於JVM的實現。

一個不錯的文章讀上Thread Scheduling

乾杯!

0

你是正確的。 D是正確的,C是錯誤的。 JLS說:

「線程可以通過擁有多個硬件處理器,通過對單個硬件處理器進行時間片切片或對多個硬件處理器進行時間片切片來支持。」

所以時間分片不是強制性的,也不是單個(「the」)CPU。所以沒有依靠兩者的答案可能是正確的。