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 を見てください)。

ノート

于 2012-11-13T01:12:54.197 に答える