SpringアプリケーションでグローバルThreadPoolTaskExecutorを作成する必要があります。これは、アプリケーションでマルチスレッドタスクを実行する責任があります。Java SpringのThreadPoolExecutorの制御
しかし、すべての要求に対して、そのグローバルThreadPoolから使用されるスレッドの数を制限する必要があります。要求ごとにこの制限が適用されることをどのように保証するべきですか?
たとえば、
最大プールサイズを50スレッドとしてグローバルスレッドプールを作成します。しかし、私はスレッドごとにスレッド数を5スレッドに制限したいと思っています。しかし、これら5つのスレッドは、コンフィグレーションファイルで定義されたグローバルスレッドプールで使用可能な50個のスレッドからのみ割り当てられます。
タスク実行プログラムを作成するための構成クラス。
@Configuration
public class ThreadPoolConfiguration {
@Value("${threadpool.corepoolsize}")
int corePoolSize;
@Value("${threadpool.maxpoolsize}")
int maxPoolSize;
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(corePoolSize);
pool.setMaxPoolSize(maxPoolSize);
pool.setWaitForTasksToCompleteOnShutdown(true);
return pool;
}
}
コントローラクラス
@RestController
public class WebController {
@Autowired
ThreadPoolTaskExecutor threadPool;
@RequestMapping("/process")
public String process(){
String msg = "";
List<Future<String>> futureList = new ArrayList<>();
for(int threadNumber = 0; threadNumber < 5; threadNumber ++){
CallableWorker callableTask = new CallableWorker(String.valueOf(threadNumber));
Future<String> result = threadPool.submit(callableTask);
futureList.add(result);
}
for(Future<String> future: futureList){
try {
msg += future.get() + "#####";
} catch (Exception e){}
}
return msg;
}
}
免責事項:これは私がblog postからもらったばかりのサンプルコードです。
このようなデザインを実装するにはどうすればよいですか?作成できるサブスレッドプールはありません。また、すべての要求に対してスレッドプールをインスタンス化することは致命的な問題ではありません。
提案がありますか?
リクエストに6つのタスクがあり、5つのスレッドに制限されている場合の動作は何ですか?最初の5つのタスクのいずれかが完了するまで待ってから、6番目のタスクをキューイングしますか? –
はい、そうです。しかし、別のリクエストには5つのタスクがあり、グローバルスレッドプールから5つのスレッドを分けてください。 は、だから私は20回の作業を取得する場合: そして、2つの要求が提出された後に、グローバルプールからの10件のスレッドが占有され、1タスクは、これらは、私はあなたの答えから理解二つの解釈されている(最初のリクエストから)待って、まだ – Amriteya