2017-09-04 2 views
0

複数のプロセスを同時に実行する必要があるアプリケーションを作成しています。実行するプロセスの数は動的であり、受け取った入力に依存します。ExecutorServiceを使用して作成されるスレッドの最大数に制限がありますか

たとえば、3つの異なるものについての情報が必要な場合(車、自転車、自動車)、3つのスレッドをそれぞれ並列に実行する必要があります。

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が正常に終了することはありません。

関連する問題