2012-07-31 85 views
1

我有一個進入數據庫並獲取數據的進程。的複雜性和我的問題如下:分叉進程

一些數據來自一個數據源,其餘來自其他數據源。我想知道,一旦我開始一個進程,我可以創建對象,在那裏我將轉儲所有的數據,然後叉(如C語言)。將每個進程發送到不同的數據源。

問題1:如果我做了像fork這樣的事情,它會同時更新數據的傾銷權嗎?即如果父進程從源A獲取數據並在對象O中轉儲,並且chil進程從B獲得並僅在對象O中轉儲,則O同時被填充到正確的位置?它不會使用來自A的數據和來自B的數據創建兩個對象。此外,此過程的效率僅在多處理器系統中嗎?

問題2:在Java中是否有這樣的東西?

謝謝。

+0

子進程不會與父級共享變量;每個孩子都有自己的單獨對象O,並且沒有任何東西會進入父母的。但是線程*做*共享變量,並且可以用來做你想做的事情。 – Wyzard 2012-07-31 07:11:05

+0

@Wyzard線程與forkde進程有什麼不同。如果你能告訴我。謝謝。 – Kraken 2012-07-31 07:12:42

+0

過程是相互隔離的;他們可以:只能以有限的方式進行交互,例如[信號](http://en.m.wikipedia.org/wiki/Unix_signal)和[套接字](http://en.m.wikipedia.org/wiki /:Berkeley_sockets)。線程是單個進程的一部分,因此它們都可以直接訪問該進程的內存。 – Wyzard 2012-07-31 07:31:46

回答

2

我會說相當於fork的java是java.lang.Thread。查看教程here

如果我理解正確的問題,它看起來像訪問DataSource該會通過您的應用程序的主線程同時訪問數據源B將通過一個單獨的線程來處理。我會忍不住在推訪問數據源,以獨立的線程,等待他們倆來完成(見javadocs),然後(在你的描述上述目的O)相結合的結果,一個單一的對象。

+0

爲什麼我需要結合結果,如果我有一個單一的對象O,最終的數據將被轉儲,現在作爲兩個線程工作,不會他們只是自己填充對象O,然後在結束時,兩個都完成傾銷,我會得到完整的數據在同一個對象O? – Kraken 2012-07-31 07:04:52

+0

你可以擁有一個單獨的對象,並讓每個線程填充它。但是你必須確定這兩個線程不能覆蓋其他的結果。我更喜歡在事件發生後將結果合併,因爲它可以更好地分離問題,並且我認爲它還使得代碼在長期內更易於維護。如果你正在使用Java 7,你應該看看@ aviad的答案 - 它會爲你節省一些工作(免責聲明 - 我沒有使用框架,只是略過了教程) – DaveH 2012-07-31 07:11:59

+0

這取決於你是什麼樣的對象用於存儲結果:除非遇到更新衝突(如果使用的對象是map,並且兩個線程都會嘗試同時更新相同的條目,那麼一切都會正常進行......))您需要仔細選擇存儲對象類型。 Java集合有幾個線程安全的包裝:請參閱http://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html – aviad 2012-07-31 07:13:47

3

您可以嘗試@DaveHoves建議的操作。 我個人更喜歡使用多源數據加載/處理時使用的另一個選項是使用ForkJoin框架。 請找好教程here

祝你好運!

+0

也許你可以參考我發佈在DaveHoves答案上的評論。謝謝。 – Kraken 2012-07-31 07:07:13

+0

當然,請參閱我的評論 – aviad 2012-07-31 07:14:07