2017-06-18 52 views
-1

如何使用固定數量的線程處理可能數量巨大的列表元素?我使用的ExecutorService的解決方案:處理具有固定線程數的列表項目

 ExecutorService threadPool = 
     Executors.newFixedThreadPool(threadsNumber); 
     for (String url : urlList) { 
      MyThread thread = new MyThread(url); 
      threadPool.execute(thread); 
     } 
     threadPool.shutdown(); 
     threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

此代碼返回我正確的輸出,而不是在每個迭代上創建一個新的線程,我想重複之前創建一個線程數,並重新使用它們。我怎樣才能做到這一點?

+0

沒有得到您的問題。我沒有看到任何區別,無論是在循環外部還是內部創建線程。你爲什麼認爲,這會有所作爲? – Ravi

+0

在循環內創建線程取決於迭代列表中元素的數量。如果列表包含大量元素,則必須創建大量線程。我想通過在循環之前創建線程來避免它受到'urlList'中若干元素的影響。 – MoBi

+0

它只會創建指定的線程數 – Ravi

回答

0

什麼是MyThread?它是否延伸ThreadExecutor的目的是爲您創建和管理線程。如果您使用的是ExecutorService,則不應該創建自己的線程。他們將被視爲普通Runnable s,而ExecutorService將使用其自己的線程池運行它們。

+0

關於MyThread - 是的,它的確如此。使用'Executor'不是強制性的。我想找到一個等效的解決方案,而不是因爲內存消耗而創建大量線程。 – MoBi

+0

解決方案不是擴展'Thread'。只需擴展'Runnable'。你已經創建的'Executor'將處理在線程之間分配任務。 – Sam

+0

這絕對有道理。謝謝! – MoBi

0

如果不想要太多的new()操作,請重複使用下面的代碼。

public class MyRunable implements Runnable { 
    private String param; 
    public void setParam(String param) { 
     this.param = param; 
    } 

    public void run() { 
      System.out.println("param: "+param + " in thread:" + Thread.currentThread().getName()); 
    } 
} 

public class Test { 
    private ExecutorService executor; 

    public Test(int threadNum) { 
     executor = Executors.newFixedThreadPool(threadNum); 
    } 

    public Future<?> submitTask(MyRunable task) { 
     Future<?> f = executor.submit(task); 
     return f; 
    } 

    public static void main(String args[]) { 
     Test test = new Test(2); 
     MyRunable task1 = new MyRunable(); 
     MyRunable task2 = new MyRunable(); 

     List<String> urls = new ArrayList<String>(); 
     urls.add("URL1"); 
     urls.add("URL2"); 
     urls.add("URL3"); 
     urls.add("URL4"); 

     try { 
      for (int i = 0; i< urls.size(); i+=2) { 
       task1.setParam(urls.get(i)); 
       task2.setParam(urls.get(i+1)); 
       Future f1 = test.submitTask(task1); 
       Future f2 = test.submitTask(task2); 
       f1.get(); 
       f2.get(); 
      } 
     } catch (Exception e) {} 
    } 
}