1

在java中:

 r1=complexCalc1();
 r2=complexCalc2();
 r3=complexCalc3();
 r4=complexCalc4();
 r5=complexCalc5();
 return r1+r2+r3+r4+r5;

假设运行时间如

complexCalc1() -> 5 mins 
complexCalc2() -> 3 mins
complexCalc3() -> 2 mins
complexCalc4() -> 4 mins
complexCalc5() -> 9 mins

如果这个程序按顺序运行,计算 r1+r2+r3+r4+r5 需要 23 分钟。如果每个函数并行运行,即在单独的线程中的每个 complexCalc() 函数,r1+r2+r3+r4+r5 计​​算的总时间将是 9 分钟。

我的问题是如何实现它。我尝试了几种方法,但我仍然无法弄清楚任何具体的东西。

提前致谢。

4

2 回答 2

2

仅使用标准 Java API 的解决方案草稿如下所示:

public class Main {
    private static final Callable<Integer> createCalculationSimulator (final int result, final int minutesToWait) {
        return new Callable<Integer> () {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(minutesToWait*60*1000L);
                return result;
            }
        };
    }

    public static void main(String[] args) throws Exception {       
        final ExecutorService executorService = Executors.newFixedThreadPool (5);
        final long startTime = System.currentTimeMillis();
        final List<Future<Integer>> results = executorService.invokeAll(
            Arrays.asList(
                createCalculationSimulator(1, 5),
                createCalculationSimulator(2, 3),
                createCalculationSimulator(3, 2),
                createCalculationSimulator(4, 4),
                createCalculationSimulator(5, 9)));

        int resultSum = 0;
        for (final Future<Integer> result : results) {
            resultSum += result.get();
        }
        final long endTime = System.currentTimeMillis();
        System.out.println("The end result is " + resultSum + ". Time needed = " + (endTime - startTime)/1000 + " seconds.");
    }
}
于 2012-11-13T01:15:40.130 回答
1

如果您可以将任务划分为逻辑独立的任务(我相信您可以按照您已经指出的那样),那么使用 Java 5+ 就相当容易了。

  • 在自己的 Callable 中实现每个任务
  • 将它们全部提交给执行者。ExecutorService.invokeAll(...)
  • 上述步骤返回一个列表,您将存储并确保所有这些都已完成(查看 api)

笔记

  • 将线程池大小初始化为等于内核数(当然,您可以在配置文件后进行调整。
  • 如果你可以有外部依赖,那么我建议使用Guava 库来简化 Executors 的使用。
于 2012-11-13T01:12:54.197 回答