ExecutorService exec = Executors.newSingleThreadExecutor();
클라이언트가 요청한 작업을 백그라운드 스레드에 위임해 처리하기 위해 작업 큐를 사용하는데, 위의 코드 한 줄로 생성 가능함
작업 넘기기
종료시키기
특정 태스크가 완료되기를 기다림
// 아이템 79의 코드
ExecutorService exec = Executors.newSingleThreadExecutor();
try {
exec.submit(() -> s.removeObserver(this)).get();
} catch (ExecutionException | InterruptedException ex) {
throw new AssertionError(ex);
} finally {
exec.shutdown();
}
태스크 모음 중 아무것 하나 혹은 모든 태스크가 완료되기를 기다림
실행자 서비스가 종료하기를 기다림
완료된 태스크들의 결과를 차례로 받기
태스크를 특정 시간에 혹은 주기적으로 실행하게 하기
⇒ 작업 큐와 스레드를 직접 다루는 것은 일반적으로 좋지 않지만, 실행자 프레임워크에서는 작업 단위와 실행 메커니즘이 분리됨
Runnable
public class Main {
public static void main(String[] args) {
// 스레드 풀 생성 (여기서는 크기가 2인 스레드 풀을 생성)
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 실행할 Runnable 객체 생성
Runnable myRunnable = new MyRunnable();
// Runnable 객체를 스레드 풀에 제출
executorService.execute(myRunnable);
// 스레드 풀 종료
executorService.shutdown();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
// 스레드가 실행할 코드를 작성
System.out.println("Runnable is running in thread: " + Thread.currentThread().getName());
}
}