FutureTask和Callable用法

时间:2012-11-30 11:17:54

标签: java multithreading callable futuretask

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

  1. 从单元格/字段中获取数据
  2. 验证数据,例如maxlenght,required etc.等。
  3. 如果行不符合特定条件,则丢弃该行。
  4. 为每一行创建一个VO并使用数据填充VO
  5. 存储VO。
  6. 所以,我正在考虑将每个行处理的未来任务用于多线程。我面临的问题是如何等待所有任务完成,因为我想发送带有最终结果的响应。只是我想让处理更快而不是实际的响应时间。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

考虑

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

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

答案 2 :(得分:0)

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

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