如何在java中的多个线程之间传输值

时间:2012-11-13 00:57:04

标签: java multithreading algorithm

在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

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

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

提前致谢。

2 个答案:

答案 0 :(得分: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.");
    }
}

答案 1 :(得分:1)

如果您可以将任务划分为逻辑独立任务(我相信您可以如您所指示的那样),那么使用Java 5 +会非常容易。

  • 在自己的Callable
  • 中实施每项任务
  • 将所有这些内容提交给执行人。 ExecutorService.invokeAll(...)
  • 上面的步骤会返回一个List,您将存储并确保所有这些都已完成(请查看api)

注意

  • 将线程池大小初始化为等于核心数(当然,您在配置文件后进行调整。
  • 如果您可以拥有外部依赖关系,那么我建议使用Guava library来简化Executors的使用。