-
Notifications
You must be signed in to change notification settings - Fork 26
Java Thread & Concurrent Package
kimahhh edited this page Jul 11, 2023
·
1 revision
참조1: https://letsmakemyselfprogrammer.tistory.com/94
참조2: https://letsmakemyselfprogrammer.tistory.com/98
java.lang.Thread 클래스를 통해 스레드 생성 및 제어 가능
- Thread 클래스를 extends하고 run 메소드를 오버라이드
- Runnable 인터페이스를 implements하고 run 메소드를 구현
- run 메소드에 스레드가 실행할 코드 작성
- Thread 객체를 생성하고 start 메소드를 호출하여 스레드 시작
현재 코드는 2번 방법으로 실행
start() / run() / join() / sleep() 같은 메서드는 os에 종속적 → System call을 통해서 os에 해당 기능 요청
os에 요청하는 코드는 jvm에 c++로 작성되어 있음
- Java 1.0: 모든 스레드가 동일한 우선순위를 가짐. Thread 클래스를 상속하거나 Runnable 인터페이스를 구현하여 스레드 생성
- Java 1.2: 스레드 그룹(Thread Group) 개념 도입 → 관련 스레드를 한 그룹으로 묶어 관리
- Java 5: 동시성(Concurrency) 유틸리티 추가 (
java.util.concurrent→ 동시성 클래스 제공) - Java 7: Fork/Join 프레임워크 추가 → 병렬처리 효율적 (divide-and-conquer 방식)
- Java 8: Stream API → 다중 스레드 쉽게 활용 / 컬렉션 연산 병렬 처리
- 스레드 간의 동기화 지원
- 동기화: 여러 스레드가 공유된 리소스를 동시에 액세스하려고 할 때 데이터 무결성을 보장하기 위해 사용
- synchronized 키워드, wait/notify 메커니즘 제공
- 스레드가 너무 많음 → 성능 저하
- 스레드 간의 데이터 공유 → 복잡성 증가, 버그 발생 가능성
- 스레드 동기화 잘못 사용 → 교착 상태(Dead Lock)
참조1: https://ddd4117.github.io/2021/05/java-concurrent-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%A0%95%EB%A6%AC/
참조2: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html
java.util.concurrent
-
Executors및 Thread Pools-
Executors: 스레드 풀 생성, 스레드 생명 주기 관리, Task 등록과 실행 등을 간편하게 처리 - 스레드 풀: 한 번에 실행할 수 있는 스레드의 수를 제한하고, 대기 중인 작업을 큐에 넣을 수 있음
-
-
Conocurrent Collections-
ConcurrentHashMap,CopyOnWriteArrayList등 - 여러 스레드가 동시에 접근할 수 있는 안전한(thread-safe) 컬렉션 제공
-
-
FuturesandCallable-
Callable:Runnable과 유사하지만 결과를 반환하고 예외를 던질 수 있는 작업 -
Future:Callable에 의해 수행된 작업의 결과를 나타냄-
Future.get을 호출하여 작업의 결과를 검색하고, 작업이 완료될 때까지 대기할 수 있음
-
-
-
Synchronizers-
CountDownLatch,CyclicBarrier,Semaphore,Exchanger,Phaser등 - 동기화 도구 제공
- 스레드가 작업을 동기화하고 서로 통신하는 데 사용
-
-
Locks- 상호 배제를 사용할 수 있는 클래스 제공
-
synchronized키워드와wait/notify메커니즘을 대체하기 위한 동기화 및 잠금 메커니즘 제공
-
Atomic Variables- 동기화가 되어 있는 변수 제공
- 원자 연산을 통해 스레드 간의 race condition을 피하면서 변수를 읽고 쓰는 데 사용