[英]How can I fix my program with ExecutorService?
所以,我是Java新手。
我編寫了一個相對簡單的程序,該程序可以處理大量文件。
速度很慢,我想運行多個線程。 在很少的StackOverflow社區幫助下,我做出了類似的事情:
public class FileProcessor {
public static void main(String[] args)
{
// run 5 threads
ExecutorService executor = Executors.newFixedThreadPool(5);
int i;
// get first and last file ID to process
int start = Integer.parseInt(args[0]);
int end = Integer.parseInt(args[1]);
for (i = start; i < end; i++)
{
final int finalId = i; // final necessary in anonymous class
executor.submit(new Runnable()
{
public void run()
{
processFile(finalId);
}
});
}
}
public static void processFile(int id)
{
//doing work here
}
}
這確實是一個非常簡單的多線程解決方案,它可以滿足我的要求。 現在,我想修復/改善它,因為我想我做錯了(程序永無休止,使用的內存比應有的多,等等)。
我將減少數Runnable
在同一時間存在於內存中的對象? 如果應該-我該怎么做?
我如何檢測到所有工作都已完成並退出程序(和線程)?
如果要減少運行的線程數,只需減小傳遞給固定線程池構造函數的大小即可。 至於終止,請在執行程序服務上調用shutdown和awaitTermination。 但這只會減少活動線程的數量,而不會減少您在循環中創建的Runnable的數量。
當您說program never ends, uses more memory than it should
,可能是由於多種原因,
1) processFile()
可能正在執行一些繁重的I / O操作(或者)它被某些I / O數據阻塞了。
2)如果存在任何公共數據對象共享,則可能存在潛在的死鎖
您的線程邏輯本身,使用ThreadPoolExecutor
非常簡單,我相信問題在於processFile()
的代碼。
由於使用5初始化了池,因此ThreadPoolExecutor
確保只有5個活動線程在工作,而與要創建多少個線程無關。
因此,在這種情況下,我將重點放在應用程序邏輯優化上,而不是線程管理上。
如果你真的關心有多少Runnable
你要的對象來創建? 然后,這是您的應用程序需求和可用資源之間的權衡。
如果每個線程任務都是獨立的,並且所有這些線程都有執行時間限制,那么您將在池中創建更多線程並添加更多資源。
當您定義一個時間限制為5個線程的PoolExecutor
並創建10,000個線程時,顯然它們必須作為內存中的Future Task
等待,直到一個線程可用為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.