6. 비동기 처리(AtomicBoolean, Future<?>)

2025. 2. 25. 16:25·프로젝트/coin-trading
    private final ConcurrentHashMap<String, Future<?>> userTrades;
    private final ExecutorService executorService;
    private final Map<String, AtomicBoolean> userRunningStatus;
    private final BackDataRepository backDataRepository;
    private final UpbitService upbitService;

- 프로그램 실행

    public void startTrading(AuthUser authUser) {
        String userId = authUser.getUserId();

        // 이미 실행 중인 거래 프로그램이 있는지 확인
        if (userTrades.containsKey(userId)) throw new CustomException(ErrorCode.TRADING_ALREADY_GENERATE);

        // 각 사용자의 running 상태 가져오기, 없으면 false로 초기화
        AtomicBoolean userRunning = userRunningStatus.computeIfAbsent(userId, k -> new AtomicBoolean(false));

        // 새로운 작업을 실행하고 Future로 저장
        Future<?> future = executorService.submit(() -> {
            try {
                // 거래 프로그램 실행 전에 running 상태를 true로 변경
                userRunning.set(true);
                startProgram(authUser);
            } catch (Exception e) {
                log.info("프로그램 실행 중 오류 발생: {}", e.getMessage());
            }
        });

        // 사용자별로 실행 상태를 userTrades에 저장
        userTrades.put(userId, future);
    }
  • 유저 정보 가져오기
  • 실행여부 확인하기
  • AtomicBoolean을 사용하여 가져온 유저에 대한 실행상태 추적하기
    ※ 일반적인 boolean 변수는 멀티스레드 환경에서 경쟁 조건(Race Condition)이 발생할 수 있다.
  • executorService.submit() 를 사용하여 비동기 실행 및 Future<?>객체로 쓰레드관리
    ※ Future<?>는 비동기 작업(쓰레드)의 실행 결과를 나타내는 객체

- 프로그램 종료

    public void stopTrading(AuthUser authUser) {
        String userId = authUser.getUserId();

        // 실행중인 프로그램 가져오기
        Future<?> future = userTrades.remove(userId);
        if (future == null) throw new CustomException(ErrorCode.TRADING_NOT_FOUND);

        // 각 사용자의 running 상태 가져오기
        AtomicBoolean userRunning = userRunningStatus.get(userId);

        // 사용자별로 running을 false로 설정하여 while문 종료
        userRunning.set(false);

        // 작업 종료
        try {
            future.cancel(true);
            log.info("{}의 거래 프로그램이 정상적으로 종료되었습니다.", userId);
        } catch (Exception e) {
            log.info("프로그램 종료 중 오류 발생: {}", e.getMessage());
        }
    }
  • userTrades에서 user의 future꺼낸 후 삭제하기
  • 동작상태 가져오기
  • running를 false로 set하여 안전하게 종료
  • future.cancel하여 프로그램 종료

- 테스트 코드

@Test
    void stopTrading() throws Exception {
        // given
        AuthUser authUser1 = new AuthUser("user1", "nick1", "secret1", "access1");
        AuthUser authUser2 = new AuthUser("user2", "nick2", "secret2", "access2");

        // when & then
        // 프로그램 2개 동작
        executorService.execute(() -> tradingService.startTrading(authUser1));
        Thread.sleep(1000);
        assertThat(userTrades).hasSize(1);
        executorService.execute(() -> tradingService.startTrading(authUser2));
        Thread.sleep(1000);
        assertThat(userTrades).hasSize(2);
        assertThat(userRunningStatus.get("user1").get()).isTrue();
        assertThat(userRunningStatus.get("user2").get()).isTrue();

        // 프로그램1 종료(실행 1 종료 1)
        tradingService.stopTrading(authUser1);
        assertThat(userTrades).hasSize(1);
        assertThat(userRunningStatus.get("user1").get()).isFalse();
        assertThat(userRunningStatus.get("user2").get()).isTrue();

        // 프로그램2 종료(실행 0 종료 2)
        tradingService.stopTrading(authUser2);
        assertThat(userTrades).hasSize(0);
        assertThat(userRunningStatus.get("user1").get()).isFalse();
        assertThat(userRunningStatus.get("user2").get()).isFalse();
    }

'프로젝트 > coin-trading' 카테고리의 다른 글

5. EC2 프로그램 동작중... 앞으로의 개선방향  (0) 2025.02.18
4. 투자전략 변경 및 EC2 배포  (0) 2025.02.10
3. chatGPT 연동하기(투자 판단)  (0) 2025.02.08
2. 업비트 매매 API 적용  (0) 2025.02.07
1. 업비트 API 적용해보기  (1) 2025.02.05
'프로젝트/coin-trading' 카테고리의 다른 글
  • 5. EC2 프로그램 동작중... 앞으로의 개선방향
  • 4. 투자전략 변경 및 EC2 배포
  • 3. chatGPT 연동하기(투자 판단)
  • 2. 업비트 매매 API 적용
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java 메서드
    프로그래머스 java 기초트레이닝
    java enhance switch
    java arrays.copyofrnage()
    java 유클리드 호제법
    java 에라토스테네스의 체
    java 세수의합
    java
    java 멤버
    데이터 타입
    java기초
    Java this
    Java 생성자
    데이터 크기
    개발로드맵
    java two-pointer
    자료구조
    프로그래머스 java 기초 트레이닝
    java super
    java 제어자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
6. 비동기 처리(AtomicBoolean, Future<?>)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.