2016-12-27 11 views

答えて

0

例はSimpleAsyncTaskExecutorを使用しています。

のJavadoc:

注:この実装は、スレッドを再利用していません!その代わりに、特に多数の短命のタスクを実行するために、スレッドプールのTaskExecutor実装を考慮してください。

したがって、CPU使用率をより効率的にするために、私はむしろThreadPoolTaskExecutor or ConcurrentTaskExecutorを使用します。

あなたのタスクはCPUに束縛されているので、スレッドプールのサイズは、実行するマシン上のCPUコアの量に設定します。そのため、スレッドを切り替える際にCPUサイクルが無駄にならないようにします。コメント

(CPUがIO操作を待っているされないように、より大きなスレッドプールのサイズを持つことは、IOバウンドのタスクに適しているであろう)

反応:

今、私はより良いあなたの懸念を理解します。はい、ステップを並行して実行できます。ここでexample from my book about enterprise Springです:

@Bean 
    public Job prepareTeaJob(JobBuilderFactory jobBuilderFactory, 
     @Qualifier("boilWaterStep") Step boilWaterStep, 
     @Qualifier("addTeaStep") Step addTeaStep, 
     @Qualifier("addSugarStep") Step addSugarStep, 
     @Qualifier("addWaterStep") Step addWaterStep, 
     TaskExecutor customTaskExecutor) { 
    Job job = jobBuilderFactory.get("prepareTeaJob") 
     .start(boilWaterStep) 
     .split(customTaskExecutor) 
     .add(new FlowBuilder<Flow>("addIngredientsSplit") 
      .from(boilWaterStep).next(addTeaStep) 
      .from(boilWaterStep).next(addSugarStep) 
      .end()) 
     .next(addWaterStep) 
     .end() 
     .build(); 
    return job; 
    } 
} 

この例からaddTeaStepaddSugarStepが右boilWaterStep後、並列に実行されます。ステップで

 Thread thread = Thread.currentThread(); 
     System.out.println(thread); 

を使用して

+0

ありがとうございました。しかし、@Michael Minellaによって与えられた例が正しく理解されていれば、SimpleAsyncTaskExecutorも新しいスレッドを開始するので、すべてのステップが並行して実行されます。または私は間違っていますか? – user2145488

+0

私は自分の答えを更新しました。 – luboskrnac

+0

@luboskmac、残念ながら、あなたの解決策では、 'Thread thread = Thread.currentThread();' System.out.println(thread); ' はただ1つのスレッドを表示します。これは本当に最適化された方法でCPUを使用していますか? – user2145488

関連する問題