반응형

`java.util.concurrent.AbstractExecutorService`는 자바에서 멀티스레딩과 관련된 작업을 수행하기 위한 추상 클래스입니다. 이 클래스는 `ExecutorService` 인터페이스를 구현하고 있으며, `ThreadPoolExecutor` 및 `ScheduledThreadPoolExecutor`와 같은 구체적인 `ExecutorService` 클래스들의 부모 클래스로 사용됩니다. 

`AbstractExecutorService`는 `execute(Runnable)` 및 `submit(Runnable)`과 같은 메서드를 제공합니다. 이러한 메서드는 스레드 풀에서 실행할 작업을 제출하는 데 사용됩니다. `execute()` 메서드는 제출된 작업에 대한 결과를 반환하지 않지만, `submit()` 메서드는 `Future` 객체를 반환하여 작업이 완료되면 결과를 가져올 수 있도록 합니다.

또한 `AbstractExecutorService`는 스레드 풀의 크기 및 스레드 생성 방법을 조절하는 방법을 제공합니다. `getCorePoolSize()`, `getMaximumPoolSize()`, `setCorePoolSize()`, `setMaximumPoolSize()`와 같은 메서드를 사용하여 스레드 풀의 크기를 조절할 수 있습니다. `newThread(Runnable)` 메서드를 사용하여 스레드를 생성할 때, `AbstractExecutorService`를 확장하는 클래스에서 이 메서드를 재정의하여 새로운 스레드의 특성을 정의할 수 있습니다.

또한 `AbstractExecutorService`는 스레드 풀에서 실행되는 작업의 처리 순서를 조절할 수 있는 메서드도 제공합니다. 예를 들어, `execute(Runnable)` 및 `submit(Runnable)` 메서드는 제출된 작업이 큐에 저장되기 전에 정렬되거나 필터링 될 수 있습니다. `beforeExecute(Thread, Runnable)` 및 `afterExecute(Runnable, Throwable)`와 같은 메서드를 사용하여 작업이 실행되기 전과 실행된 후에 수행할 작업을 정의할 수도 있습니다.

`AbstractExecutorService`는 스레드 풀에서 실행되는 작업을 효율적으로 처리하기 위한 다양한 메서드와 기능을 제공합니다. 그러나 이 클래스는 추상 클래스이기 때문에 이를 직접적으로 사용할 수는 없습니다. 대신 `ThreadPoolExecutor` 및 `ScheduledThreadPoolExecutor`와 같은 구체적인 `ExecutorService` 클래스를 사용해야 합니다.`AbstractExecutorService` 클래스는 스레드 풀에서 실행되는 작업의 수행을 관리하는 데 필요한 몇 가지 추가적인 메서드를 제공합니다. 이러한 메서드는 스레드 풀의 작업 처리 동작을 조절하는 데 사용됩니다.

`getActiveCount()` 메서드는 현재 활성화된 스레드 수를 반환합니다. 활성화된 스레드는 작업을 처리하고 있는 스레드입니다. `getTaskCount()` 메서드는 이전에 제출된 총 작업 수를 반환합니다. `getCompletedTaskCount()` 메서드는 이전에 완료된 총 작업 수를 반환합니다.

`isShutdown()` 메서드는 스레드 풀이 종료되었는지 여부를 확인하는 데 사용됩니다. `shutdown()` 메서드는 스레드 풀을 종료하는 데 사용됩니다. `isTerminated()` 메서드는 모든 작업이 완료되고 스레드 풀이 종료되었는지 여부를 확인하는 데 사용됩니다. `awaitTermination()` 메서드는 스레드 풀이 종료될 때까지 기다리는 데 사용됩니다.

`AbstractExecutorService`는 `java.util.concurrent` 패키지에서 매우 중요한 클래스 중 하나이며, 멀티스레딩과 관련된 작업을 수행할 때 많이 사용됩니다. 그러나 이 클래스는 추상 클래스이므로, 구체적인 `ExecutorService` 클래스를 사용해야 하며, 사용 방법과 함께 개발자가 스레드 풀을 적절하게 구현할 수 있도록 도와줍니다.다음은 `AbstractExecutorService`를 상속하는 간단한 클래스인 `MyExecutorService`의 예제 코드입니다. 이 예제 코드에서는 `AbstractExecutorService`의 `newThread(Runnable)` 메서드를 재정의하여 스레드의 이름과 우선순위를 설정하는 방법을 보여줍니다.

 

import java.util.concurrent.*;

public class MyExecutorService extends AbstractExecutorService {
    private final ThreadPoolExecutor executor;

    public MyExecutorService(int corePoolSize, int maxPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        this.executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    public void execute(Runnable command) {
        executor.execute(command);
    }

    @Override
    public Future<?> submit(Runnable task) {
        return executor.submit(task);
    }

    @Override
    public void shutdown() {
        executor.shutdown();
    }

    @Override
    public List<Runnable> shutdownNow() {
        return executor.shutdownNow();
    }

    @Override
    public boolean isShutdown() {
        return executor.isShutdown();
    }

    @Override
    public boolean isTerminated() {
        return executor.isTerminated();
    }

    @Override
    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
        return executor.awaitTermination(timeout, unit);
    }

    @Override
    protected Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setName("MyThread");
        t.setPriority(Thread.MIN_PRIORITY);
        return t;
    }
}


위의 예제 코드에서는 `ThreadPoolExecutor`를 사용하여 스레드 풀을 생성합니다.

`MyExecutorService` 클래스는 `AbstractExecutorService`를 상속하여, `execute()`, `submit()` 등의 메서드를 구현합니다. `newThread()` 메서드를 재정의하여 새로운 스레드의 이름과 우선순위를 설정합니다.

`execute()` 메서드와 `submit()` 메서드는 내부적으로 `executor` 객체의 `execute()`와 `submit()` 메서드를 호출하여 작업을 스레드 풀에 제출합니다.

`shutdown()`, `shutdownNow()`, `isShutdown()`, `isTerminated()`, `awaitTermination()` 등의 메서드는 스레드 풀을 제어하기 위한 기본적인 메서드를 구현합니다.

위의 예제 코드는 `AbstractExecutorService`의 `newThread()` 메서드를 재정의하여 스레드의 이름과 우선순위를 설정하는 방법을 보여줍니다.

이 예제 코드에서는 `MyThread`라는 이름과 `Thread.MIN_PRIORITY` 우선순위를 갖는 스레드를 생성합니다.

이러한 설정을 통해, 스레드가 어떤 작업을 수행하는지 쉽게 파악할 수 있으며, 우선순위가 낮은 스레드는 CPU 자원을 적게 사용하여 시스템의 전체 성능에 영향을 미치지 않습니다.

반응형

+ Recent posts