Java의 병렬 처리

MD Aminul Islam 2023년10월12일
  1. 병렬 처리와 순차 처리의 차이점
  2. parallelStream()을 사용하는 Java의 병렬 처리
  3. parallel()을 사용한 Java의 병렬 처리
  4. CompletableFuture를 사용한 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를 설치해야 합니다.

MD Aminul Islam avatar MD Aminul Islam avatar

Aminul Is an Expert Technical Writer and Full-Stack Developer. He has hands-on working experience on numerous Developer Platforms and SAAS startups. He is highly skilled in numerous Programming languages and Frameworks. He can write professional technical articles like Reviews, Programming, Documentation, SOP, User manual, Whitepaper, etc.

LinkedIn

관련 문장 - Java Multithreading