-1

我有一个要实现的功能,我正在考虑使用 FutureTask 和可调用的 calsses。只是想验证我是否可以使用它,以及在这种情况下使用这些类是否正确。这里是:我正在使用 struts spring hibernate 开发一个 Web 应用程序。我必须上传一个包含大约 40 列/字段和大约 1000 行的 excel/.csv/.txt 类型的文件。我必须处理该行的每一行和每个字段。这将包括以下子任务:

  1. 从单元格/字段中获取数据
  2. 验证数据,例如 maxlenght ,required 等。
  3. 如果该行不符合特定条件,则丢弃该行。
  4. 为每一行创建一个 VO 并用数据填充一个 VO
  5. 存储VO。

因此,我正在考虑为每个行处理使用未来的任务以使其成为多线程。我面临的问题是如何等待所有任务完成,因为我想发送带有最终结果的响应。只是我想让处理更快而不是实际响应时间。

4

3 回答 3

0

我将定义一个RecursiveAction的子类,它将从 excel 表中获取所有行并将它们分解为单行并执行基本案例部分中每一行提到的操作,在此 RecursiveAction 对象上使用ForkJoinPool的方法invoke()等待操作完成,然后报告它。可以为计算方法本身的基本案例部分中的每一行构建报告。查看有关如何使用Fork/Join的文档。

于 2012-11-30T11:31:57.650 回答
0

考虑

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

它执行任务并在全部完成后返回 Futures 列表。

于 2012-11-30T11:33:08.260 回答
0

看起来每行的工作量相当小,因此并行化确实只能增加执行和响应时间。最耗时的操作是存储到数据库中,批量存储所有 1000 行比单独存储每一行​​要快得多。

如果你真的想在并行任务中拆分行处理,那么做少量的任务,大致等于处理器核心的数量(Runtime.availableProcessors())。在主线程中,声明一个队列(例如,ConcurrentLinkedQueue),并让每个任务将其结果(已处理的行子集)放入该队列。主线程获取结果,当收集到所有结果(只计算它们)时,在数据库中存储一个批次。

于 2012-11-30T12:29:23.690 回答