-1

FutureTask と呼び出し可能な calsses を使用することを考えている実装機能があります。これを使用できるかどうか、およびそのような状況でこれらのクラスを使用することが正しいかどうかを確認したいだけです。ここにあります:私はStruts spring hibernateを使用してWebアプリケーションに取り組んでいます。約 40 列/フィールドと約 1000 行を含むタイプのファイルをアップロードする必要があります。各行とその行の各フィールドを処理する必要があります。これには、次のサブタスクが含まれます。

  1. セル/フィールドからデータを取得する
  2. maxlength 、required などのデータの検証。
  3. 特定の基準を満たさない行を破棄します。
  4. 行ごとに VO を作成し、VO にデータを入力する
  5. VOを保存します。

そこで、各行の処理にfuture taskを使ってマルチスレッド化しようと考えていました。私が直面している問題は、最終結果で応答を送信したいので、すべてのタスクが完了するまで待つ方法です。実際の応答時間ではなく、処理を高速化したいだけです。

4

3 に答える 3

0

Excel シートからすべての行を取得して単一の行に分割し、base-case-section の各行で説明されている操作を実行するRecursiveActionのサブクラスを定義し、この RecursiveAction オブジェクトでForkJoinPoolのメソッドを使用します。invoke()操作が完了するのを待ってから、それを報告します。レポートは、計算方法自体の base-case-section の行ごとに作成できます。Fork/Joinの使用方法に関するドキュメントをご覧ください。

于 2012-11-30T11:31:57.650 に答える
0

検討

ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks)

タスクを実行し、すべてが完了すると Future のリストを返します。

于 2012-11-30T11:33:08.260 に答える
0

各行の作業量はかなり少ないように見えるため、実際に並列化すると実行時間と応答時間が増加するだけです。最も時間のかかる操作はデータベースへの格納であり、1000 行すべてをバッチで格納する方が、各行を個別に格納するよりもはるかに高速です。

行の処理を並列タスクに分割したい場合は、プロセッサ コアの数とほぼ同じ数のタスクを作成します (Runtime.availableProcessors())。メイン スレッドで、キュー (ConcurrentLinkedQueue など) を宣言し、各タスクがその結果 (処理された行のサブセット) をそのキューに入れるようにします。メイン スレッドは結果を取得し、すべての結果が収集されると (それらをカウントするだけです)、データベースにバッチを格納します。

于 2012-11-30T12:29:23.690 に答える