2017-09-04 21 views
0

我正在創建一個需要多個進程並行運行的應用程序。要運行的進程數是動態的,它取決於接收到的輸入。例如,如果用戶想要關於三種不同的事物[汽車,自行車,汽車]的信息,那麼我需要三個獨立的線程來並行運行每一個線程。對使用​​ExecutorService創建的最大線程數有任何限制

numberOfThreadsNeeded = getNumberOfThingsFromInput(); 

ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsNeeded); 

代碼段:

公共類ConsoleController {

private static final Log LOG = LogFactory.getLog(ConsoleController.class); 

@Autowired 
ConsoleCache consoleCache; 

Metrics metrics; 

public List<Feature> getConsoleData(List<String> featureIds, Map<String, Object> input, Metrics metrics) { 
    this.metrics = metrics; 
    List<FeatureModel> featureModels = 
      featureIds 
        .stream() 
        .map(consoleCache::getFeature) 
        .collect(toList()); 

    Integer numberOfThreadsNeeded = getThreadCount(featureModels); 
    ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsNeeded); 

    featureModels.stream() 
      .map(f -> (Callable<Result>)() -> f.fetchData(input, metrics)) 
        .map(executor::submit) 
        .collect(toList())); 

要創建的線程數從1到100它是安全的變化在初始化時定義thread pool大小? 並且我想知道在parallel中運行100 threads是否安全?

+0

您是否正在爲每個用戶請求創建一個全新的執行器? – Ruslan

+0

是的。對於每個請求,都會創建一個單獨的執行程序實例。 –

回答

0

根據Java沒有硬限制,但是例如在JVM實現或操作系統中可能存在限制。所以,實際上有一個限制。還有一點,增加更多的線程可能會使性能變差,而不是更好。此外,有可能會耗盡內存。

您使用ExecutorService的方式不是它打算使用的方式。通常情況下,您會創建一個最適合您環境的線程限制數的ExecutorService。

請記住,即使您真的想要並行執行所有任務,但由於硬件/軟件併發限制,無論如何您都無法實現它。

順便說一句,如果你仍然想要爲每個請求創建一個ExecutorService - 不要忘記調用它的shutdown()方法,否則JVM將無法正常退出,因爲線程仍然處於閒置狀態。

相關問題