HOWTO · Java

Java의 병렬 처리

이 자습서에서는 Java에서 병렬 처리 구현에 대해 설명합니다.

이 페이지의 내용

병렬 처리는 최신 프로그래밍의 새로운 추세입니다. 이 처리를 통해 여러 작업을 동시에 실행하여 처리 시간을 줄일 수 있지만 작업은 독립적이어야 합니다.

이 기사에서는 주제를 더 쉽게 만들기 위해 필요한 예제 및 설명과 함께 Java의 병렬 처리를 볼 것입니다.

병렬 처리와 순차 처리의 차이점

순차 처리에서는 작업의 모든 독립적인 프로세스가 하나씩 실행되며 한 프로세스가 작동하면 다른 프로세스가 대기해야 합니다.

반면 병렬 처리에서는 여러 프로세스가 동시에 실행될 수 있으며 한 프로세스가 끝날 때까지 기다릴 필요가 없습니다. 병렬 처리는 멀티태스킹에 필수적입니다.

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를 설치해야 합니다.