다중 스레드 응용 프로그램을 개발할 때 일반적으로 스레드 작업 구성을 처리해야 합니다. 응용 프로그램이 클수록 다중 스레드 작업에 필요한 스레드가 많을수록실행 가능우리가 만드는 객체.

여기에서 Java로 스레드를 생성하는 것은 다소 비용이 많이 드는 작업이라는 점에 유의해야 합니다. 작업을 수행하기 위해 매번 스레드의 새 인스턴스를 생성하면 성능에 큰 문제가 발생하고 결과적으로 애플리케이션의 상태에 문제가 발생합니다.

여기서 스레드 ThreadPoolExecutor가 도움이 됩니다.

스레드 풀은 미리 초기화된 스레드 집합입니다. 크기는 고정되거나 가변적일 수 있습니다.

스레드보다 작업이 많으면 작업이 작업 대기열에서 대기합니다. 풀의 N번째 스레드는 대기열에서 작업을 가져오고 작업이 완료된 후 스레드는 대기열에서 새 작업을 선택합니다. 대기열의 모든 작업이 실행되면 스레드는 활성 상태를 유지하고 새 작업을 기다립니다. 새 작업이 나타나면 스레드도 해당 작업을 실행하기 시작합니다.

ThreadPoolExecutor

Java 5부터 Executor 프레임워크는 멀티스레딩 솔루션을 얻었습니다. 일반적으로 많은 구성 요소가 있으며 그 목적은 대기열과 스레드 풀을 효율적으로 관리하는 데 도움이 되는 것입니다.

주요 인터페이스는 ExecutorExecutorService 입니다 .

Executor 는 단일 void execute(Runnable runnable) 메서드가 있는 인터페이스입니다.

이 메서드의 구현에 작업을 전달할 때 나중에 비동기적으로 실행된다는 점을 알아두세요.

ExecutorService — Executor 인터페이스를 확장하여 작업 실행 기능을 추가하는 인터페이스입니다. 또한 실행 중인 작업을 중단하고 스레드 풀을 종료하는 메서드도 있습니다.

ThreadPoolExecutor는 Executor ExecutorService 인터페이스를 구현하고 작업 생성과 작업 실행을 분리합니다. Runnable 객체를 구현하고 실행기로 보내야합니다그런 다음 ThreadPoolExecutor 작업 실행과 스레드 생성 및 작업을 담당합니다.

실행을 위해 작업을 보낸 후 풀의 기존 스레드가 사용됩니다. 이렇게 하면 성능이 향상됩니다. 새 스레드를 생성하고 초기화하는 데 리소스를 낭비하는 문제를 해결한 다음 스레드 작업이 완료되면 다시 가비지 수집을 수행합니다.

ThreadPoolExecutor 에는 4개의 생성자가 있습니다.

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

ThreadPoolExecutor 생성자 에는 다음 매개변수가 있습니다.

corePoolSize 이 매개변수는 실행기 서비스가 시작될 때 준비(시작)될 스레드 수를 나타냅니다.
최대 풀 크기 실행기 서비스가 생성할 수 있는 최대 스레드 수입니다.
keepAliveTime 스레드 수가 다음보다 큰 경우 해제된 스레드가 소멸되기 전에 계속 유지되는 시간corePoolSize. 시간 단위는 다음 매개변수에 지정됩니다.
단위 시간 단위(시, 분, 초, 밀리초 등).
작업 대기열 작업 대기열 구현.
매니저 완료할 수 없는 작업에 대한 핸들러입니다.
스레드팩토리 요청 시 새 스레드를 생성하는 개체입니다. 스레드 팩토리를 사용하면 새로운 스레드 하드웨어를 독립적으로 호출하여 애플리케이션이 특수 스레드 하위 클래스, 우선 순위 등을 사용할 수 있습니다.

ThreadPoolExecutor 생성

Executors 유틸리티 클래스 ThreadPoolExecutor 생성을 단순화할 수 있습니다 . 이 유틸리티 클래스의 메서드는 다음을 준비하는 데 도움이 됩니다.ThreadPoolExecutor물체.

newFixedThreadPool — 고정된 수의 스레드를 재사용하여 원하는 수의 작업을 실행하는 스레드 풀을 만듭니다.
ExecutorService executor = Executors.newFixedThreadPool(10);
newWorkStealingPool — 스레드 수가 JVM에서 사용할 수 있는 프로세서 코어 수와 동일한 스레드 풀을 만듭니다. 기본 동시성 수준은 1입니다. 즉, JVM에서 사용할 수 있는 CPU 코어만큼 많은 스레드가 풀에 생성됩니다. 동시성 수준이 4이면 코어 수 대신 전달된 값이 사용됩니다.
ExecutorService executor = Executors.newWorkStealingPool(4);
newSingleThreadExecutor — 모든 작업을 실행하는 단일 스레드로 풀을 만듭니다.
ExecutorService executor = Executors.newSingleThreadExecutor();
newCachedThreadPool — 필요에 따라 새 스레드를 생성하지만 사용 가능한 경우 이전에 생성된 스레드를 재사용하는 스레드 풀을 생성합니다.
ExecutorService executor = Executors.newCachedThreadPool();
newScheduledThreadPool — 지정된 지연 후 또는 주기적으로 실행할 명령을 예약할 수 있는 스레드 풀을 만듭니다.
ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);

다음 단원에서는 각 유형의 풀을 고려할 것입니다.