본문 바로가기
Java

Java 21 가상스레드(virtual thread) | 01 동시성 기본 개념 이해

by 긴소리 2024. 12. 31.
728x90
반응형

1. 동시성과 병렬 처리의 차이

 

1. 동시성(Concurrency)

동시성은 작업을 동시에 진행할 수 있는 능력을 의미합니다.

  • 핵심 아이디어:
    여러 작업이 동시에 진행 중인 것처럼 보이지만, 실제로는 빠르게 작업 간 전환(context switching)을 통해 실행됩니다.
    (싱글 코어에서도 가능)

특징:

  • CPU가 하나라도 동작 가능.
  • 스케줄링에 의해 각 작업이 빠르게 교대 실행.
  • 시간 분할(Time-Slicing) 방식으로 수행.

비유:

  • 한 사람이 여러 일을 처리하는 상황:
    예를 들어, 한 사람이 이메일 작성과 전화받기를 번갈아가며 수행하는 것.
Thread thread1 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
        System.out.println("Thread 1: " + i);
    }
});
Thread thread2 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
        System.out.println("Thread 2: " + i);
    }
});

thread1.start();
thread2.start();

 

2. 병렬 처리(Parallelism)

병렬 처리는 여러 작업을 물리적으로 동시에 실행하는 것을 의미합니다.

  • 핵심 아이디어:
    실제로 여러 코어(또는 여러 CPU)가 각각의 작업을 동시에 수행.
    (멀티 코어에서만 가능)

특징:

  • 여러 코어의 물리적 자원을 활용.
  • 각 작업이 실제로 동시에 실행되기 때문에 더욱 빠름.
  • 데이터를 병렬로 처리하면 대량의 계산을 효율적으로 수행 가능.

비유:

  • 여러 사람이 각각 일을 나눠 처리하는 상황:
    예를 들어, 한 명은 이메일을 작성하고 다른 한 명은 전화받기를 동시에 수행.
import java.util.stream.IntStream;

public class ParallelExample {
    public static void main(String[] args) {
        IntStream.range(1, 11).parallel().forEach(i -> {
            System.out.println("Processing number: " + i + " by " + Thread.currentThread().getName());
        });
    }
}

주요 차이점 비교


특징                                                동시성(Concurrency) 병렬 처리(Parallelism)
작업 방식 빠르게 교대 실행 (싱글 코어에서도 가능) 물리적으로 동시에 실행 (멀티 코어 필요)
요구 사항 스케줄러가 있는 OS와 프로세서 멀티 코어 CPU
속도 향상 작업 전환 비용 존재, 병렬 처리만큼 빠르지 않음 물리적 병렬 처리로 더 빠른 성능 제공
주요 사례 네트워크 I/O, 비동기 처리 과학 계산, 빅데이터 분석

3. 실제 차이를 이해하는 방법

  • 싱글 코어 환경:
    동시성은 스레드 간 작업 전환으로 실행되지만, 물리적으로 하나씩 실행됩니다.
  • 멀티 코어 환경:
    병렬 처리는 여러 코어에서 작업을 동시에 실행하며, 동시성은 작업 간의 전환을 병행합니다.

 

4. 자바 스레드의 기본 동작 방식

  • 스레드란?: 운영 체제에서 작업을 병렬로 실행하기 위한 단위.
  • 스레드의 상태:
    • New → Runnable → Running → Blocked/Waiting → Terminated.

5. 실습: 간단한 스레드 생성 및 실행

예제 1: 기본 스레드 실행

public class ThreadExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("Running in thread: " + Thread.currentThread().getName());
        });
        thread.start(); // 스레드 시작
        System.out.println("Main thread: " + Thread.currentThread().getName());
    }
}

 

예제 2: 여러 스레드 생성 및 실행

public class MultiThreadExample {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(() -> {
                System.out.println("Thread: " + Thread.currentThread().getName());
            });
            thread.start();
        }
        System.out.println("Main thread: " + Thread.currentThread().getName());
    }
}

 

예제 3: 스레드 풀 사용

 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3); // 3개의 스레드 풀 생성

        for (int i = 0; i < 5; i++) {
            final int task = i;
            executor.execute(() -> {
                System.out.println("Task " + task + " running in: " + Thread.currentThread().getName());
            });
        }

        executor.shutdown(); // 스레드 풀 종료
    }
}
반응형

댓글