2014-01-26 41 views
0

我設計了一個java應用程序。一位朋友建議使用多線程,他聲稱將我的應用程序作爲多個線程運行會顯着減少運行時間。java應用多線程設計與優化

在我的主類中,我進行了一些超出我們範圍的操作來填充全局靜態變量和哈希映射,以便在整個生命週期中使用。然後,我在數組列表的條目上運行應用程序的核心。

 for(int customerID : customers){ 
     ConsumerPrinter consumerPrinter = new ConsumerPrinter(); 
     consumerPrinter.runPE(docsPath,outputPath,customerID); 
     System.out.println("Customer with CustomerID:"+customerID+" Done"); 
    } 

爲給定客戶的這個循環個XML的每次迭代是從機器,解析和計算採取在解析的數據獲取。稍後,處理後的結果將寫入文本文件(獲取和寫入的數據最多可達幾Giga字節,平均可達50 MB)。多個迭代可以在同一個文件上寫入。

我應該讓這段代碼是多線程的,這樣每一組客戶都被帶入一個獨立的線程嗎?

我如何知道最優化的線程數量?

在實現多線程時需要考慮哪些最佳實踐?

回答

0
Should I make this piece of code multi-threaded so each group of customers are taken 
in an independent thread? 

是的多線程將節省您的處理時間。在列表中迭代時,您可以在每次迭代中產生新線程,並在其中進行客戶處理。但是,如果兩個客戶處理需要在同一資源上進行操作,則必須執行正確的同步意義,則必須同步該操作以避免可能出現的爭用情況或內存不一致問題。

How can I know the most optimal number of threads to run? 

你不能真正地沒有實際分析具有不同線程數的n個客戶的處理時間。這取決於您的處理器的內核數量,以及每個客戶正在進行的實際處理。

What are the best practices to take into consideration when implementing multi-threading? 

首要標準是您必須擁有多個核心,並且您的操作系統必須支持多線程。幾乎所有的系統都在目前這樣做,但它是一個很好的標準。其次,您必須分析可能導致race condition的所有可能情況。您知道的所有資源將在多個線程中共享,必須爲thread-safe。此外,您還必須注意memory inconsistency issues(聲明您的變量爲volatile)的可能性。最後,有些東西只有在你真正運行測試用例如deadlocks(需要分析線程轉儲)或memory leaks(需要分析堆轉儲)時才能預測或分析。

0

多線程的想法是讓一些繁重的過程變成另一個,比如說......「內存塊」。

任何UI更新必須在主/默認線程上完成,例如打印信息或膨脹視圖。您可以要求應用程序繪製位圖,從互聯網上下載圖像或使用大量的驗證/循環塊在獨立的線程上運行它們,想象您正在創建第二個短生命應用程序來處理這些任務。

請記住,您可以讓應用程序在另一個線程上下載/繪製圖像,但必須在主線程的屏幕上打印此圖像。

這是常見的用於在分離的線程上加載較大的位圖,進行數學計算以調整此大圖像的大小,然後在主線程上向用戶膨脹/打印/繪製/顯示較小版本的圖像。在你的情況下,我不知道多重的runPE()方法是多少,我不知道它是什麼,你可以嘗試爲他創建另一個線程,但其餘的應該在主線程上,它是你的UI的主要過程。

您可以通過將「ConsumerPrinter consumerPrinter = new ConsumerPrinter();」在「for(...)」之前,由於它不會改變dinamically,所以可以在循環內部將其刪除,以避免每次循環重新啓動時創建同一對象:)

0

雖然直java多線程可以使用(java.util.concurrent)作爲其他答案已經討論過,也考慮多線程的替代編程方法,如actor model。 actor模型仍然使用下面的線程,但很多複雜性由actor框架處理,而不是由程序員直接處理。此外,由於創建使用actor模型的程序的方式,因此在線程之間的共享狀態上進行同步的需求減少(或不需要)。

查看Which Actor model library/framework for Java?瞭解流行演員模型庫的討論。