Java ExecutorService는 스레드에서 작업을 비동기적으로 실행할 수 있게 해주는 인터페이스입니다. Java ExecutorService 인터페이스는 java.util.concurrent 패키지에 있습니다. ExecutorService는 스레드 풀을 유지 관리하고 스레드에 작업을 할당하는 데 도움을 줍니다. 또한 작업 수가 사용 가능한 스레드보다 많은 경우 사용 가능한 여유 스레드가 있을 때까지 작업을 대기열에 추가하는 기능을 제공합니다.
Java ExecutorService의 메소드
방법 | 설명 |
---|---|
boolean waitTermination(긴 시간 초과, TimeUnit 단위) | 이 메서드는 종료 요청 후 모든 작업이 완료되거나 지정된 시간 초과가 발생하거나 현재 스레드가 중단될 때까지 ExecutorService에 들어가는 작업을 차단합니다. |
목록 | 이 메소드는 주어진 작업 목록을 실행하고 완료되면 모든 작업의 결과가 포함된 Future 목록을 반환합니다. |
목록 | 이 메소드는 주어진 작업 목록을 실행하고 완료되거나 제한 시간이 만료되는 경우 중 먼저 발생하는 모든 작업의 결과가 포함된 Future 목록을 반환합니다. |
T 호출Any(컬렉션 extends Callable>작업) | 이 메소드는 주어진 작업 목록을 실행하고 예외가 발생하지 않고 완료된 하나의 작업 결과를 반환합니다. |
T 호출Any(컬렉션 extends Callable>작업, 긴 시간 초과, TimeUnit 단위) | 이 메소드는 주어진 작업 목록을 실행하고 제한 시간이 경과하기 전에 예외를 발생시키지 않고 완료된 하나의 작업 결과를 반환합니다. |
부울 isShutdown() | 이 메서드는 지정된 실행 프로그램이 종료되었는지 여부를 반환합니다. |
부울 isTerminating() | 이 메서드는 종료 후 모든 작업이 실행된 경우 true를 반환합니다. |
무효 종료() | 이 방법을 사용하면 이전에 ExecutorService에 제출된 작업을 완료할 수 있으며 다른 작업은 허용되지 않습니다. |
shutdownNow() 나열 | 이 메서드는 현재 실행 중인 모든 작업을 중지하고, 대기열에 있는 작업의 실행을 중지하고, 대기열에 있는 작업 목록을 반환합니다. |
향후 제출(호출 가능한 작업) | 이 메서드는 실행을 위해 값 반환 작업을 제출하고 작업의 보류 중인 결과를 나타내는 Future를 반환합니다. |
향후 제출(실행 가능한 작업) | 이 메서드는 실행할 작업을 제출하고 해당 작업을 나타내는 Future를 반환합니다. 성공적으로 완료되면 null을 반환합니다. |
향후 제출(실행 가능한 작업, T 결과) | 이 메소드는 실행을 위해 작업을 제출하고 해당 작업을 나타내는 Future를 반환합니다. |
Java ExecutorService의 간단한 프로그램
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
산출:
이 프로그램에서는 10개의 스레드가 있는 ExecutorService를 생성하고 'ExecutorService'를 인쇄하는 작업을 수행하는 익명의 실행 가능 구현을 할당하고 해당 작업이 끝나면 실행기 서비스를 종료합니다.
Java ExecutorService를 사용하는 방법
ExecutorService 인스턴스화
Java ExecutorService를 사용하여 단일 스레드, 스레드 풀 또는 예약된 스레드 풀을 생성할 수 있습니다. Executors 클래스는 다음과 같이 ExecutorService를 인스턴스화하는 팩토리 메서드를 제공합니다.
MySQL 우분투 다시 시작
ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads.
ExecutorServices에 작업 할당
ExecutorService에 작업을 할당하려면 다음 방법을 사용할 수 있습니다.
- 실행(실행 가능한 작업)
- submit(실행 가능한 태스크) / submit(호출 가능한 태스크)
- 호출Any(컬렉션 extends Callable>작업)
- 호출All(컬렉션 extends Callable>작업)
ExecutorService에 ExecutorService에 작업을 할당하는 예
정렬 알고리즘 병합 정렬
Java ExecutorService의 Executor() 메소드는 실행 가능한 객체를 가져와 해당 작업을 비동기적으로 수행합니다. 실행 메소드를 호출한 후, 다른 작업이 executorService의 대기열에 추가되는 것을 차단하는 shutdown 메소드를 호출합니다.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
산출:
ExecutorService
submit()을 사용하여 ExecutorService에 작업을 할당하는 예
submit() 메소드는 실행 가능한 객체를 받아 Future 객체를 반환합니다. 이 객체는 나중에 Runnable의 실행 완료 여부를 확인하는 데 사용됩니다.
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } }
InvokeAny() 메소드를 사용하여 ExecutorService에 작업을 할당하는 예
InvokeAny() 메소드는 Callablle 객체 또는 Callable을 구현하는 클래스 객체의 컬렉션을 사용합니다. 이 메소드는 먼저 성공적으로 실행된 호출 가능 객체의 미래 객체를 반환합니다.
Java 객체를 json으로 변환
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); String result = executorService.invokeAny(callables); System.out.println('result = ' + result); executorService.shutdown(); } } </callable></callable>
산출:
result = Task 1
결과는 첫 번째 호출 가능 개체가 먼저 성공적으로 실행되므로 작업 1을 저장합니다.
InvokeAll() 메소드를 사용하여 ExecutorService에 작업을 할당하는 예
np 패딩
InvokeAll() 메소드는 작업이 있는 Callable 객체의 컬렉션을 가져오고 모든 작업의 결과가 포함된 Future 객체 목록을 반환합니다.
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println('future.get = ' + future.get()); } executorService.shutdown(); } } </future></callable></callable>
산출:
future.get = Task 1 future.get = Task 3 future.get = Task 2
ExecutorService를 종료하는 방법
ExecutorService에 주어진 작업을 마친 후에는 ExecutorService가 다른 스레드에서 작업을 수행하기 때문에 이를 종료해야 합니다. ExecutorService를 종료하지 않으면 스레드는 계속 실행되고 JVM은 종료되지 않습니다.
종료 프로세스는 다음 세 가지 방법으로 수행할 수 있습니다.
- 종료() 메서드
- shutdownNow() 메서드
- waitTermination() 메서드