マルチスレッド戻り値収集の実装
マルチスレッド戻り値収集の実装
最近、大量のデータをクエリーして分析し、結果を処理する必要がある需要があります.データ量が比較的大きいため,マルチスレッドを用いてデータのクエリーや処理を行うが,最後に結果を収集する際に問題が発生した.Runnableインタフェースを使用してマルチスレッドの実装を開始しますが、このメソッドでは戻り値がサポートされていないため結果が得られません.その後、パラメータが集合に渡されて収集されます.この場合、サブプログラムはまだ完了していません.メインプログラムは実行済みであり、集合は空であり、収集結果は失敗します.クエリーの結果、javaマルチスレッドにはCallableインタフェースがあり、このインタフェースは戻り値をサポートし、マルチスレッドの実行結果を収集できない問題を解決していることがわかりました.具体的な操作は以下の通りです(完全なコードではありません).
1.Callableインタフェースの実現
Callable戻り値のタイプは、自分のニーズに合わせて変更できます.
2.ExecutorService呼び出しオープンスレッド
future.get()はスレッドが返す結果を取得し、スレッドが終了しない場合、メインスレッドはここでサブスレッドが完了するのを待って、結果を返します.
最近、大量のデータをクエリーして分析し、結果を処理する必要がある需要があります.データ量が比較的大きいため,マルチスレッドを用いてデータのクエリーや処理を行うが,最後に結果を収集する際に問題が発生した.Runnableインタフェースを使用してマルチスレッドの実装を開始しますが、このメソッドでは戻り値がサポートされていないため結果が得られません.その後、パラメータが集合に渡されて収集されます.この場合、サブプログラムはまだ完了していません.メインプログラムは実行済みであり、集合は空であり、収集結果は失敗します.クエリーの結果、javaマルチスレッドにはCallableインタフェースがあり、このインタフェースは戻り値をサポートし、マルチスレッドの実行結果を収集できない問題を解決していることがわかりました.具体的な操作は以下の通りです(完全なコードではありません).
1.Callableインタフェースの実現
public class ExportAccForecast implements Callable<List<Map>>{
}
Callable戻り値のタイプは、自分のニーズに合わせて変更できます.
2.ExecutorService呼び出しオープンスレッド
public static ExecutorService executorService;
executorService = new ThreadPoolExecutor(CPUNum * threadNumPerCPU*2, CPUNum * threadNumPerCPU*2, 0L,
TimeUnit.MILLISECONDS, workQueue,
new CBSSOrderThreadFactory());
for (TRegion region : provinceRegionList) {
Future<List<Map>> future = CBSSOrderProcessor.executorService.submit(new ExportAccForecast(region));
List<Map> maps = future.get();
dataList.addAll(maps);
}
future.get()はスレッドが返す結果を取得し、スレッドが終了しない場合、メインスレッドはここでサブスレッドが完了するのを待って、結果を返します.