자바8to11

Executors

lby132 2022. 12. 22. 15:05

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