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(); // 스레드 풀 종료
}
}
반응형
'Java' 카테고리의 다른 글
자바 비동기 CompletableFuture, ForkJoinPool의 개요 및 사용법 (1) | 2024.12.31 |
---|---|
자바21 가상 스레드(Virtual Threads) 이해 - 5회차 학습계획 (1) | 2024.12.31 |
java CloneNotSupportedException 해결 방법, 발생 예시 (0) | 2024.05.20 |
Object clone() 정의, 활용 (0) | 2024.05.20 |
[JAVA] 방향과 순서가 있는 데이터의 흐름, Stream (0) | 2023.06.02 |
댓글