3장. Java의 최신 동시성 메커니즘
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
모든 사물에는 원인이 있기 때문에 그 원인을 알기 전에는 어떤 지식도 획득되거나 완성되지 않습니다.
이븐 시나(아비세나), 서기 1025년경
무언가를 사용하는 방법을 아는 것도 중요하지만, 그것이 어떻게 작동하는지 이해하는 것은 필수적입니다. 내부 작동 원리를 이해하면 더 잘 이해할 수 있을 뿐만 아니라 발생하는 문제도 빠르게 해결할 수 있습니다. 그렇기 때문에 가상 스레드가 구현된 방식과 그 내부를 아는 것은 Java 개발자에게 매우 중요합니다. 이 장에서는 가상 스레드가 내부적으로 어떻게 작동하고 구현되는지 살펴보겠습니다.
가상 스레드가 구현되는 방식을 이해하려면 두 가지 개념을 알아야 합니다. 하나는 ForkJoinPool 이고, 다른 하나는 연속성입니다. ForkJoinPool 은 가상 스레드를 스케줄링하는 스케줄러입니다. 연속은 가상 스레드가 실행을 일시 중지했다가 일시 중지된 지점에서 다시 시작할 수 있는 방법의 한 측면입니다. 스레드 풀을 소개하는 것으로 시작하여 ForkJoinPool 및 가상 스레드를 수용하기 위해 약간 다르게 구현된 방법에 대해 점차적으로 자세히 살펴보겠습니다.
스레드 풀
첫 번째 장에서는 기본적으로 스레드 풀을 구현하는 Java Executor 프레임워크에 대해 설명했습니다. 하지만 스레드 풀이 어떻게 작동하는지, 가장 중요한 스레드 풀이 왜 필요한지에 대해서는 충분히 설명하지 못했습니다.
이름에서 알 수 있듯이 스레드 풀은 애플리케이션이 시작될 때 생성되어 애플리케이션 전체에서 계속 실행되는 스레드 그룹입니다. 스레드 풀을 만드는 전략은 풀의 종류에 따라 다를 수 있지만, 핵심적인 아이디어는 여러 개의 스레드를 준비하고 계속 실행한다는 것입니다. 스레드 풀에는 작업을 보관할 대기열이 있습니다. 대기열에서 작업을 선택하고 스레드를 사용할 수 있게 되는 즉시 작업을 실행합니다. 실행이 완료되면 다음 작업을 선택하고 대기열에 사용 가능한 작업이 있는 동안 작업을 계속 실행합니다. 사용 가능한 작업이 없으면 새 작업을 사용할 수 있을 때까지 기다립니다. 모든 스레드가 다른 작업을 실행하는 중이면 추가 작업이 대기열에 배치되고 스레드를 사용할 수 있게 될 때까지 대기합니다.
스레드 풀이 필요한 이유는 무엇인가요?
1장에서 살펴본 것처럼 스레드를 만드는 것은 쉽지만, 임시로 많은 스레드를 만드는 것은 문제가 될 수 있습니다. 요구가 증가함에 따라 임시로 스레드를 계속 생성하면 결국 운영 체제에서 허용하는 최대 스레드 수에 도달하여 애플리케이션이 충돌하는 바람직하지 않은 결과를 초래할 수 있습니다. 실행 중인 애플리케이션에서 생성할 수 있는 스레드 수를 제어하고 싶을 때 스레드 풀을 사용하면 이러한 제어가 가능합니다. 또한 너무 많은 동시 작업으로 인해 압도당할 수 있는 리소스를 자연스럽게 속도 제한할 수 있는 방법도 제공합니다. ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access