Thread Pool은 사전에 생성된 스레드의 집합이며, 작업을 실행하기 위해 재사용되는 스레드들을 관리한다. 이 방식은 새로운 작업을 위해 매번 스레드를 생성하고 소멸시키는 오버헤드를 줄여준다. 작업이 발생하면, Thread Pool에서 사용 가능한 스레드가 작업을 처리하고, 작업 완료 후 다시 Pool에 반환되어 다른 작업을 기다린다. Thread Pool은 동시성 레벨을 조절하고, 리소스를 효율적으로 사용하며, 시스템의 부하를 관리하는 데 유용하다.
Thread Pool에서 스레드 수를 결정할 때 고려해야 할 기준은 다음과 같다:
Monitor는 동시에 실행되는 스레드들 사이의 상호 작용을 안전하게 관리하기 위한 동기화 메커니즘이다. Monitor 내부의 모든 메소드는 동시에 하나의 스레드만이 접근할 수 있도록 보장한다. 이는 메소드 또는 코드 블록에 대한 뮤텍스 락을 자동으로 관리함으로써, 공유 자원에 대한 동시 접근을 제어한다. 자바에서는 synchronized
키워드를 사용하여 메소드나 코드 블록을 Monitor로 만들 수 있다.
Fork-Join은 병렬 프로그래밍을 위한 프레임워크로, 큰 작업을 작은 작업으로 분할하고(분기), 그 결과를 합쳐(결합) 최종 결과를 도출하는 패턴을 기반으로 한다. 이 패턴은 재귀적으로 작업을 분할하여, 작은 작업들을 병렬로 실행한 후 그 결과를 합치는 방식으로 작동한다. Fork-Join 프레임워크는 작업 도둑질(Work Stealing) 알고리즘을 사용하여, 다른 스레드가 완료된 작업을 기다리지 않고 남은 작업을 가져와 처리함으로써 프로세서의 유휴 시간을 최소화한다. 자바에서는 java.util.concurrent
패키지의 ForkJoinPool
클래스를 사용하여 Fork-Join 프레임워크를 구현할 수 있다.
데이터를 정렬할 때 안전성과 성능을 모두 고려하는 전략은 다음과 같다:
안전하면서도 좋은 성능을 내기 위해서는 데이터의 특성, 사용 가능한 자원, 그리고 성능 요구사항을 종합적으로 고려하여 적절한 정렬 전략을 선택해야 한다. 경우에 따라, 여러 전략을 결합하거나 조정해야 할 수도 있다.