카샤의 만개시기

동기화 클래스 5편 - Executors, FutureTask, Future 본문

Java/POJO

동기화 클래스 5편 - Executors, FutureTask, Future

SKaSha 2019. 7. 3. 18:02

실제 결과가 필요한 시점보다 훨씬 이전에 시간이 많이 필요한 작업을 미리 해두는 용도로 사용합니다.
FutureTask는 시작 전 대기, 시작됨, 종료 3가지 상태로 구분할 수 있고 한번 종료상태가 되면 더 이상 상태가 바뀌지 않습니다.
Future.get()메소드는 FutureTask의 작업이 종료되면 그 결과를 즉시 알려줍니다.

class MyRunnable implements Runnable { 
      private final long waitTime; 

    public MyRunnable(int timeInMillis) { 
        this.waitTime = timeInMillis; 
    } 

    @Override
    public void run() { 
        try { 
            Thread.sleep(waitTime); 
            System.out.println(Thread .currentThread().getName()); 
        } catch (InterruptedException ex) { } 
    } 
} 

class Main { 

    public static void main(String[] args) { 
        MyRunnable myrunnableobject1 = new MyRunnable(1000); 
        MyRunnable myrunnableobject2 = new MyRunnable(2000); 

        FutureTask<String> 
            futureTask1 = new FutureTask<>(myrunnableobject1, 
                                           "FutureTask1 is complete"); 
        FutureTask<String> 
            futureTask2 = new FutureTask<>(myrunnableobject2, 
                                           "FutureTask2 is complete"); 

        // 2개의 Thread를 가진 ThreadPool 생성
        ExecutorService executor = Executors.newFixedThreadPool(2); 

        // futureTask를 ExecutorService에 보내서 실행
        executor.submit(futureTask1); 
        executor.submit(futureTask2); 

        while (true) { 
            try { 
                // 모든 future task 완료
                if (futureTask1.isDone() && futureTask2.isDone()) { 
                    System.out.println("FutureTask Complete"); 

                    // 수행중인 Future Task가 모두 종료되면 종료. (자동으로 Executor가 제거되지 않는다.)
                    // showdownNow()는 수행중인 task가 있더라도 인터럽트시켜 강제 종료한다.
                    executor.shutdown(); 
                    return; 
                } 

                if (!futureTask1.isDone()) { 
                    // get()을 호출하면 쓰레드 작업이 완료 될때까지 기다림
                    System.out.println("FutureTask1 output = "
                                       + futureTask1.get()); 
                } 

                System.out.println("Waiting for FutureTask2 to complete"); 

                // 250ms시간동안 쓰레드 결과값이 나오길 기다림.
                String s = futureTask2.get(250, TimeUnit.MILLISECONDS); 

                if (s != null) { 
                    System.out.println("FutureTask2 output=" + s); 
                } 
            } 

            catch (Exception e) { 
                Sysmtem.out.println("Exception: " + e); 
            } 
        } 
    } 
} 
Comments