🥳자바의 ExecutorService
는 스레드 풀을 생성해주는 메소드로 이를 통해 복잡한 멀티스레딩 관리를 단순화하고 관리를 쉽게 할 수 있습니다.
😑ExecutorService
는 자바의 java.util.concurrent
패키지에 있는 인터페이스로, 스레드 풀 관리와 비동기 작업 실행을 위한 API를 제공합니다. 이를 사용하면 작업을 스레드에 할당하고, 작업 완료를 추적하며, 스레드 생명주기를 관리할 수 있습니다.
😎ExecutorService
에서 스레드 풀을 만드는 데 사용되는 몇 가지 주요 메소드들이 있습니다. 상황에 맞게 자신에게 알맞은 스레드 풀을 생성하는데 도움을 줍니다.
newFixedThreadPool
Executors.newFixedThreadPool(int [원하는 스레드 개수])
[]
는 풀 내에서 생성될 스레드의 개수를 지정합니다.ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
//4개의 스레드를 갖는 스레드 풀 생성
newCachedThreadPool
Executors.newCachedThreadPool()
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
newSingleThreadExecutor
Executors.newSingleThreadExecutor()
ExecutorService singleThreadExecutor =
Executors.newSingleThreadExecutor();
newScheduledThreadPool
Executors.newScheduledThreadPool(int corePoolSize)
ScheduledExecutorService scheduledThreadPool =Executors.newScheduledThreadPool(2);
😰생성된 스레드 풀은 반드시 종료되어야 합니다. shutdown
메소드를 통해 종료 할 수 있으며 만약 종료하지 않을 경우 시스템이 계속 실행됩니다.(main 메소드가 끝났음에도 불구하고 스레드풀이 종료되지 않았기에 더 남은 할일이 있는 것으로 파악하고 종료를 하지 않습니다.)
newCachedThreadPool
은 필요에 따라 스레드를 무제한으로 생성할 수 있습니다. 그러므로 예측가능한 곳에서만 사용해야 합니다.
🧐Runnable
또는 Callable
작업을 ExecutorService
에 제출할 수 있습니다. 각각 반환값이 없는 작업과 반환값이 있는 작업을 의미합니다.
executorService.submit(() -> {
// 수행할 작업 내용
System.out.println("Asynchronous task running");
});
//반환값이 없는 Runnalbe입니다. return으로 값을 반환하면 Callable
🤔작업이 모두 제출되면, ExecutorService
를 종료해야 합니다. shutdown
메소드를 호출하여 스레드 풀을 종료합니다. 이미 제출된 작업은 완료되기 전까지 계속 실행됩니다.
executorService.shutdown();
🫠다음 예시 코드는 ExecutorService
를 이용한 코드입니다.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class sample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < 5; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
}
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
}
}
😎위 코드는 2개의 스레드를 갖는 풀을 생성한 후에 작업을 진행하는 코드입니다.
awaitTermination()
는 main이 스레드 풀의 작업이 끝날때가지 기다리게 해주는 메소드로 10초가 지난후에도 끝나지 않는다면 종료하는 메소드입니다.
shutdown()
을 진행하게 되면 더 이상 새로운 작업을 받아서 진행하지 않는 다는 의미입니다.
위 코드를 실행하면 2개의 스레드가 5개의 작업을 진행하게 됩니다.
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1