Executors.newSingleThreadExecutor
//Executors는 스레드를 만들고 관리하고 작업을 실행한다.
final ExecutorService executorService = Executors.newSingleThreadExecutor();
//Executor는 Runnable의 기능을 가지고 있고 ExecutorService는 Executor를 상속하고 있다.
executorService.submit(() -> { //submit은 다른 작업이 들어올때까지 계속 대기한다. 그래서 다음작업이 없으면 shoutdown을 시켜줘야한다.
System.out.println("Thread " + Thread.currentThread().getName());
});
executorService.shutdown(); //현재 작업중인것들은 다 마치고 끝낸다.
// executorService.shutdownNow(); //현재 작업중인것들은 다 마치고 끝낼지 안끝낼지 예측할 수 없음.
Executors.newFixedThreadPool
//Executors는 스레드를 만들고 관리하고 작업을 실행한다.
final ExecutorService executorService = Executors.newFixedThreadPool(2);//스레드 풀을 두개 생성했기 때문에 두개의 스레드로 번갈아가면서 코드를 실행한다.
executorService.submit(getRunnable("Hello"));
executorService.submit(getRunnable("Hello1"));
executorService.submit(getRunnable("Hello2"));
executorService.submit(getRunnable("Hello3"));
executorService.submit(getRunnable("Hello4"));
executorService.shutdown(); //현재 작업중인것들은 다 마치고 끝낸다.
}
private static Runnable getRunnable(String message) {
return () -> System.out.println(message + Thread.currentThread().getName());
}
Executors.newSingleThreadScheduledExecutor
//Executors는 스레드를 만들고 관리하고 작업을 실행한다.
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.schedule(getRunnable("Hello"), 3, TimeUnit.SECONDS); //3초 후에 실행
executorService.shutdown(); //현재 작업중인것들은 다 마치고 끝낸다.
}
private static Runnable getRunnable(String message) {
return () -> System.out.println(message + Thread.currentThread().getName());
}
invokeAll, invokeAny
ExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
Callable<String> hello = () -> {
Thread.sleep(2000L);
return "hello";
};
Callable<String> hello1 = () -> {
Thread.sleep(3000L);
return "hello1";
};
Callable<String> hello2 = () -> {
Thread.sleep(1000L);
return "hello2";
};
//invokeAll은 모든 스레드들이 들어올때까지 기다렸다가 출력
// List<Future<String>> futures = executorService.invokeAll(Arrays.asList(hello, hello1, hello2));
// for (Future<String> f : futures) {
// System.out.println(f.get());
// }
//invokeAny는 먼저 들어오는 것만 출력
final String s = executorService.invokeAny(Arrays.asList(hello, hello1, hello2));
System.out.println("invokeAny = " + s);
executorService.shutdown();
cancel, isDone
final ExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
Callable<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
final Future<String> submit = executorService.submit(hello);
System.out.println(submit.isDone()); //isDone을 통해 끝났는지 체크 실행이 끝나지 않았으면 false
System.out.println("Started");
//submit.get(); //hello에서 걸어준 sleep2초동안 기다린다.
submit.cancel(false); //파라미터값 false는 실행중인 작업을 기다리고 true는 기다리지 않고 종료
System.out.println(submit.isDone());
System.out.println("End");
executorService.shutdown();
'자바8to11' 카테고리의 다른 글
메서드참조 (0) | 2022.12.30 |
---|---|
CompletableFuture (0) | 2022.12.23 |
Date (0) | 2022.12.21 |
stream, optional (0) | 2022.12.20 |
함수형 인터페이스 (0) | 2022.12.18 |