싱글쓰레드 사용하기
System.out.println("ExecutorService 사용방법\n");
//싱글스레드 사용
ExecutorService executorService = Executors.newSingleThreadExecutor();
//사용방법 1 : execute(new Runnable()) 고전적인 방법
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("1. Thread "+Thread.currentThread().getName());
}
});
//사용방법 2 : submit()
executorService.submit(()-> {
System.out.println("2. Thread "+Thread.currentThread().getName());
});
/*
executorService는 작업을 실행하고나면 다음 작업이 들어올때까지 계속해서 대기하므로 프로세스가 종료되지 않는다
-> 따라서 명시적으로 프로세스를 종료해줘야 한다
shutdown() _ gracefull하다 즉, 하고있는 일을 마무리하고 종료
shutdownNow() _ noMercy하다, 일의 마무리를 보장하지 않고 그냥 종료
*/
executorService.shutdown();
원하는 쓰레드 풀 개수로 제한하기
System.out.println("\n고정쓰레드로 개수 제한하기\n");
//2개의 쓰레드를 고정쓰레드 개수로 사용하겠다
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(getRunnable("Hello"));
executorService.submit(getRunnable("woonsik"));
executorService.submit(getRunnable("the"));
executorService.submit(getRunnable("java"));
executorService.submit(getRunnable("Thread"));
executorService.shutdown();
private static Runnable getRunnable(String string) {
return ()-> System.out.println(string + Thread.currentThread().getName());
}
/*
어떻게 2개의 쓰레드로 5개의 작업을 수행?
메인에서 executor service에 5개의 작업을 보낸다
-> Thread pool에는 2개의 쓰레드만 존재 && Blocking Queue가 존재
-> 쓰레드가 바쁘면 나머지는 blocking queue에서 기다리고있다가 수행이 된다
*/
System.out.println("싱글쓰레드 쓰케쥴executors");
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
//3초 대기 후 출력 (Runnable command, long delay, TimeUnit unit) <- 매개변수
executorService.schedule(getRunnable("Hello"), 3, TimeUnit.SECONDS);
executorService.shutdown();
//특정 시간마다 반복 - 1초기다렸다가 2초마다 반복 (command, initial delay, period, TimeUnit unit)
executorService.scheduleAtFixedRate(getRunnable("hello"), 1, 2, TimeUnit.SECONDS);