HOWTO · Java

Java での並列処理

このチュートリアルでは、Java での並列処理の実装について説明します。

このページの内容

並列処理は、最新のプログラミングにおける新しいトレンドです。 この処理により、複数のタスクを同時に実行できるため、処理時間が短縮されますが、タスクは独立している必要があります。

この記事では、トピックを簡単にするために必要な例と説明とともに、Java での並列処理について説明します。

並列処理と順次処理の違い

逐次処理では、タスクのすべての独立したプロセスが 1つずつ実行され、1つのプロセスが動作しているときに別のプロセスが待機する必要があります。

一方、並列処理では、一度に複数のプロセスを実行でき、1つのプロセスの終了を待つ必要はありません。 マルチタスクには並列処理が不可欠です。

parallelStream() を使用した Java での並列処理

この例では、Java で並列処理を実行する方法を示します。 以下の例を見てみましょう。

// importing necessary packages
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JavaParallal {
  public static void main(String[] args) {
    // Creating an integer array
    Integer[] IntArray = {1, 2, 3, 4, 5, 6, 7, 8};
    // Creating a list from the integer array
    List<Integer> NumList = new ArrayList<>(Arrays.asList(IntArray));

    System.out.println("The list elements using Serial Stream:");
    NumList.stream().forEach(num -> System.out.print(num + " ")); // Sequencial processing here
    System.out.println("");

    System.out.println("The list elements using Parallel Stream:");
    NumList.parallelStream().forEach(
        num -> System.out.print(num + " ")); // Parallal processing here
    System.out.println("");
  }
}

私たちはすでに各行の目的を命じました。 このコードを実行すると、コンソールに次のような出力が表示されます。

The list elements using Serial Stream:
1 2 3 4 5 6 7 8
The list elements using Parallel Stream:
6 5 8 3 7 4 2 1

parallel() を使用した Java での並列処理

以下の例では、メソッド parallel() を使用して並列処理を実行する方法を示しました。

次の内容のテキスト ファイルがあるとします。

This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
This is line 6
This is line 7
This is line 8

以下のサンプル コードを確認してください。

// importing necessary packages
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;

public class JavaParallal {
  public static void main(String[] args) throws IOException {
    // Locating the file
    File MyFile = new File("G:\\Java Projects\\SimpleJavaCodes\\src\\SampleTexts.txt");

    Stream<String> FileContent = Files.lines(MyFile.toPath()); // Reading the file

    FileContent.parallel().forEach(System.out::println); // Parallal

    FileContent.close();
  }
}

私たちはすでに各行の目的を命じました。 このコードを実行すると、コンソールに次のような出力が表示されます。

This is line 6
This is line 5
This is line 2
This is line 1
This is line 4
This is line 7
This is line 8
This is line 3

CompletableFuture を使用した Java での並列処理

以下の例では、CompletableFuture メソッドを使用して並列処理を実行する方法を示しました。 以下のサンプルコードを見てください。

// importing necessary packages

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public class JavaCompleteTableFuture {
  public static void main(String[] args) {
    try {
      List<Integer> MyList = Arrays.asList(2, 3, 5); // Declaring a list element
      MyList.stream()
          .map(Number -> CompletableFuture.supplyAsync(() -> GetNumber(Number)))
          .map(CompletableFuture -> CompletableFuture.thenApply(N -> N * N))
          .map(T -> T.join())
          .forEach(S -> System.out.println(S + " "));

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  private static int GetNumber(int a) {
    return a + a;
  }
}

上記の例では、

  1. supplyAsync() - このメソッドはジョブを非同期的に完了します。 デフォルトでは、メソッド ForkJoinPool.commonPool() はサプライヤーからタスクを実行します。
  2. thenApply() - このメソッドは関数を引数として受け取り、現在のステージが正常に完了した後に新しい CompletableStage を返します。
  3. join() - このメソッドは、完了後に結果を返します。

上記のコマンドを実行すると、コンソールに次のような出力が表示されます。

16
36
100

ここで共有されているコード例は Java であることに注意してください。システムに Java がない場合は、環境に Java をインストールする必要があります。