2013-03-08 85 views
0

我的問題很簡單:Java:多進程獨立任務

我在Ubuntu上工作,我用Java編寫了一個程序(使用Eclipse IDE)。 程序不會在任何地方讀取或寫入任何內容,它只是進行大量計算並創建許多自制類的實例。 該程序的輸出很簡單:在終端寫入A,B或C(將其視爲一個隨機過程)

我必須重複運行程序,直到獲得1000000次A並計算次數我得到了B和C,我做到了,它有效,但速度太慢。

例如:輸出爲: 「A:1000000 B:1012458 C:1458」

這是我需要你的幫助:

我想並行程序。我嘗試了多線程,但它不能工作得更快!所以,雖然每個模擬都是獨立的,但我想要進行多處理。例如,我想創建10個Proccess並讓他們運行該程序,直到A出現100000次。 (所以10 * 100000 = 1000000,因爲我想) 問題是,我需要知道B和C的總數,現在我得到了每個10的值。

我該怎麼辦?我嘗試了ProcessBuilder(http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html),但我不明白它是如何工作的!

我至今唯一的想法就是要問我的程序(以A至100000)10倍,用下面的命令終端: 「Java的主要& Java的主要& Java的主要& Java的主要& Java的主要& java的主& java主要& java主要& java主要& java主要「 但是,然後我必須使B和C出現的總和MANUALLY。我相信有更好的方法來做到這一點!我想過用(A),B和C的值創建10個文件,然後閱讀所有這些文件,並總結它們實際上只是對一些整數求和很多工作,不是嗎?

謝謝前鋒,我在等待救援:d

PS:要輕鬆地回答,讓我們考慮我有一個名爲「編程」是隻需要int參數的程序,代表AI的數量要達到。

回答

0

僅當您有多核CPU時,並行纔有意義。運行java.lang.Runtime.availableProcessors()來知道應該運行多少個線程。

然後,由於應用程序的內部狀態正在改變,因此運行10批次的100000次重複與運行一個具有1000000次重複的批次是不同的,因此請考慮並行是否適用於您的情況。

要知道A,B和C結果的總數,只需對所有線程使用AtomicInteger。每次檢查A的計數是否小於1000000.

0

您可以嘗試使用Runtime.exec(...)方法的其中一個版本啓動您的prog的主類。通過這個,你可以使用它的process' outputStream向主程序傳輸每個進程計算出的值。

+0

謝謝,它應該以這種方式:) – Beetlejuice 2013-03-13 08:18:15

0

在單臺機器上,與多進程相比,使用多線程時並行處理更高效。但是,在單核/單CPU系統上運行時,並行處理只會帶來較小的性能損失,但對純計算沒有性能優勢。 - 但是,例如,當涉及多個緩慢的IO時,多線程可能最終加速進程。

簡而言之:多處理將永遠是比多線程更慢

+0

「與多進程相比,使用多線程時並行處理更高效」:現在,幾乎每臺計算機都是多處理。 Mine有4 * 2內核,所以multu處理比多線程更快 – Beetlejuice 2013-03-13 08:20:32

+0

抱歉,這是一個誤解:在多核機器上,單個進程中的多個*線程也被操作系統分配給可用內核。因此單個進程*可以通過多線程並行運行在多個內核上。但是,開銷不僅是w.r.t.在一個進程中管理大量*線程*和它們的交互*導致的性能總是低於相同數量的進程所需的**。 – JimmyB 2013-03-14 10:03:48