簡體   English   中英

如何使用ExecutorService修復程序?

[英]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
    }
}

這確實是一個非常簡單的多線程解決方案,它可以滿足我的要求。 現在,我想修復/改善它,因為我想我做錯了(程序永無休止,使用的內存比應有的多,等等)。

  1. 我將減少數Runnable在同一時間存在於內存中的對象? 如果應該-我該怎么做?

  2. 我如何檢測到所有工作都已完成並退出程序(和線程)?

如果要減少運行的線程數,只需減小傳遞給固定線程池構造函數的大小即可。 至於終止,請在執行程序服務上調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM