2015-04-12 61 views
3

我在寫一個計算兩個平方矩陣乘法的簡單程序。 程序應該在我預先定義的線程數之間劃分工作。在加入所有線程之前main()端可以運行嗎?

我這樣做的方式是每個線程計算結果矩陣的不同行。

所以run()方法的每個線程執行的是:

@Override 
public void run() { 
    for (int y = 0; y < numLines; y++) 
     for (int x = 0; x < matrixSize; x++) 
      result[startLine + y][x] = singleIndexCalc(startLine + y, x); 
} 

此程序是不同步(任意位置)。 所以我的問題是如果我必須照顧在結束main()方法之前加入線程,否則它並不重要,因爲線程將(肯定)完成運行並死亡。

我這樣問,因爲我不想離開正在運行的線程(當它們等待實例時可能發生的事情),但在這個例子中,它是不可能的。

謝謝!

+1

是的。它可以。 'main'由另一個線程運行,這個線程與其他任何線程一樣,在沒有任何事情可做時退出。 –

+0

但是,例如當涉及同步時,這不是正確的做法。由於一些線程可能會停滯不前,我不希望應用程序結束運行,並留下一些正在運行的線程......對嗎? – johni

+0

我不知道你想要什麼,只有你知道。 –

回答

1

是的,主線程可以在其他線程結束之前結束運行。

看那Thread類的setDaemon()方法:https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setDaemon(boolean)

將該線程標記爲守護線程或用戶線程。當只有運行的線程都是守護進程線程時,Java虛擬機纔會退出。

該方法必須在線程啓動之前調用。

JVM將全部關閉非守護進程線程完成執行。

在你的情況下,一旦主線程和工作線程完成執行,JVM將關閉,程序將結束。

一個有趣的注意事項:如果主線程不在任何工作線程上調用join(),它可能實際上在工作線程完成執行之前結束。

相關問題