Future 패턴
Clean Software/Design Pattern

Future 패턴

728x90
반응형

스레드는 코드의 실행에 초점이 맞춰져 있고, 그 결과를 받는 시점이 불분명하다.

스레드가 단순히 코드를 실행하는 것에서 끝나는 것이 아니라,

그 실행의 결과를 다른 스레드에서 받기 위한 패턴이다.

 

 

출처: https://hamait.tistory.com/748

 

 B 에서 일을 처리한 결과를 C 에 입력해서 처리하고 결과를 받아야 한다고 할때 (체이닝이 필요할때) 
메인쓰레드에서는 B 의 결과를 기다렸다가 C 에게 넣어주고 또 C 의 결과를 기다리는 것보다
(비록 멀티쓰레드 프로그래밍을 하고는 있다지만 먼가 답답하다)
메인쓰레드는 그냥 모든것을 잊어버리고 자기 주력의 일을 하고,

B 에게 던진일은 알아서 B -> C-> Somthing 이 되게 한다면 효율적일 것이다. 

웹어플리케이션으로 얘기하자면 클라이언트의 요청을 받는 놈은 계속 받는일에만 신경쓰고, 

(요청이 어떻게 처리되고 있는지 신경을 딱 끊어버리고)

요청을 처리하는 녀석들이 높은 동시성 효율을 보이도록 잘 구성해서 성능을 높이자. 라는거죠.

 

 

 


예제

 

future 사용 안한 일반적인 코드

 

  public static void main(String[] args){
        long startTime = System.currentTimeMillis();

        CarRepairShop shop = new CarRepairShop();

        // (작업1) 차량 수리비 (시간 오래걸리는 작업)
        int carRepairCost = shop.getCarRepairCostSync(10);
        Logger.log(LogType.PRINT, "# (1) 차량 수리비 계산이 완료되었습니다.");
        Logger.log(LogType.PRINT, "# 차량 수리비는 " + carRepairCost + "원 입니다.");

        // (작업2) 회사에 병가 신청
        requestSickLeave("20170903-01");

        // (작업3) 보험 접수
        requestInsurance("44나4444");

        long endTime = System.currentTimeMillis();

        double executeTime = (endTime - startTime) / 1000.0;

        System.out.println();
        System.out.println("# 처리 시간: " + executeTime + "초");
    }



    private static void requestSickLeave(String empNumber) {
        try {
            Thread.sleep(1000);

            Logger.log(LogType.PRINT, "# (2) 병가 신청이 완료되었습니다.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }



    private static void requestInsurance(String carNumber) {
        try {
            Thread.sleep(1000);

            Logger.log(LogType.PRINT, "# (3) 보험 접수가 완료 되었습니다.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

작업1 (차량 수리비 (시간 오래걸리는 작업))을 future 에게 맡기고, 

작업2 (병가 신청), 작업3 (보험청구)는 동시에 실행하도록했다. 

    public static void main(String[] args){
        long startTime = System.currentTimeMillis();
        Logger.log(LogType.PRINT, "# Start");
        CarRepairShop shop = new CarRepairShop();

        // (작업1) 차량 수리비(시간이 더 오래 걸리는 미래에 끝날 일)
        Future<Integer> future = shop.getCarRepairCostAsync(10);

        // (작업2) 회사에 병가 신청(짧은 처리 시간)
        requestSickLeave("20170903-01");

        // (작업3) 보험 청구(짧은 처리 시간)
        requestInsurance("44나4444");

        try {
            int carRepairCost = future.get();
            Logger.log(LogType.PRINT, "# (1) 차량 수리비 계산이 완료되었습니다.");
            Logger.log(LogType.PRINT, "# 차량 수리비는 " + carRepairCost + "원 입니다.");
        } catch (Exception e) {
            e.printStackTrace();
        }

        long endTime = System.currentTimeMillis();

        double executeTime = (endTime - startTime) / 1000.0;

        System.out.println();
        System.out.println("# 처리 시간: " + executeTime);
    }

    private static void requestSickLeave(String empNumber) {
        try {
            Thread.sleep(1000);
            Logger.log(LogType.PRINT, "# (2) 병가 신청이 완료되었습니다.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void requestInsurance(String carNumber) {
        try {
            Thread.sleep(1000);
            Logger.log(LogType.PRINT, "# (3) 보험 접수가 완료 되었습니다.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

 

 

참고

 

hamait.tistory.com/748

 

초보자를 위한 동시성과 Future

1. 그림으로 보는 동시성 2. 동시성과 Future 이야기 3. 자바로 밑바닥부터 Future 구현 4. 언어별 Future 살펴보기 1. 그림으로 보는 동시성 은행에 창구가 하나입니다.  사람들은 줄을 서서 일을 처리

hamait.tistory.com

12bme.tistory.com/380

 

[자바] Future 패턴

future라는 것은 "미래", "(경제 용어로는)선물"이라는 의미입니다. 실행 결과를 얻기까지 시간이 걸리는 메소드가 있다고 합시다. 실행 결과를 얻기까지 기다리는 대신 "교환권"을 받게 됩니다. 교

12bme.tistory.com

 

728x90
반응형