2015-10-20 18 views
0

我有其中消費者/生產者程序:將被處理轉換爲ExecutorService的

  • 項(字符串)進入一個的BlockingQueue
  • 我實例化來自BlockingQueue的執行取()的螺紋固定數量的然後處理這些字符串。

的處理線程是這個類的實例:

class ProcessingThread extends Thread { 

    private void process(String s) { 
     (big method with calls to other big methods) 
    } 

    public void run() { 
     String s = queue.take(); 
     process(s); 
    } 
} 

轉換爲一個Executor將是相當簡單:絃樂將直接進入執行程序,用一個Runnable一起:

class Task implements Runnable { 

    private void process(String s) { 
     (big method with calls to other big methods) 
    } 

    public void run() { 
     process(s); 
    } 

} 

然後:

executor.execute(new Task(s)); 

但是......每次我實例化一個任務時,它都會實例化一個非常大的代碼塊(處理器) - 我不能這樣做,內存需求會變得天高。

我該怎麼做?

+2

「*它會實例化一大塊代碼*」=>你是什麼意思? – assylias

+3

「實例化一大塊代碼」是什麼意思?所有實例共享相同的代碼。每次你實例化一個對象時,並不是每個方法的字節碼都被複制。 – aioobe

+0

我的意思是ProcessingThread類很大,並且生成的Runnable對於實例化來說也很大且昂貴。 –

回答

0

我最終採取了Damien O'Reilly的建議。

然後,您需要相應地分配您的VM堆。或者如果需要水平和/或垂直縮放。但是,就你所知,實例化一個類多次,並不會導致所述類字節碼的多個副本。 - Damien O'Reilly 10月20日16:43