728x90
반응형
스레드는 코드의 실행에 초점이 맞춰져 있고, 그 결과를 받는 시점이 불분명하다.
스레드가 단순히 코드를 실행하는 것에서 끝나는 것이 아니라,
그 실행의 결과를 다른 스레드에서 받기 위한 패턴이다.
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();
}
}
참고
728x90
반응형
'Clean Software > Design Pattern' 카테고리의 다른 글
[디자인 패턴] Iterator(반복자 패턴) (0) | 2022.02.16 |
---|---|
디자인 패턴(Design patterns) - 적절한 디자인패턴 선택방법과 사용법 (0) | 2022.02.14 |
디자인 패턴(Design pattern) - 객체지향 개발시 발생되는 어떤 문제를 해결해줄까 (0) | 2022.01.26 |
디자인 패턴(Design pattern) - 정의 및 분류 (0) | 2021.04.25 |
Android 아키텍처(Architecture) 비교하기 - MVP, MVC, MVVM (0) | 2021.04.09 |