[Java] 동기(Synchronous) vs 비동기(Asynchronous)

2024. 4. 4. 18:41·Java
728x90

 

Java 언어는 동기적으로 코드를 실행한다. 하지만 CompletableFuture, ExecutorService, Future 등 비동기 처리를 유도하는 클래스를 사용하여 비동기 작업을 수행할 수 있다. 그렇다면 여기서 동기와 비동기의 차이가 무엇인지 의문점이 들 것이다. 둘의 차이에 대해 알아보도록 하자.

 

동기(Synchronous)와 비동기(Asynchronous)의 차이는 뭘까?

 

동기 (Synchronous)

 

동기는 작업이 순차적으로 실행되는 방식을 말한다. 하나의 작업이 완료되기 전까지 다음 작업이 실행되지 않는다. 일반적으로 Java의 코드는 한 메소드의 처리가 완료되어야 다음 메소드를 실행한다. 예시 코드를 함께 보자.

public class SyncExample {
    public static void main(String[] args) {
        System.out.println("첫번째 작업 시작");
        processTask1();
        processTask2();
        System.out.println("작업 완료");
    }

    public static void processTask1() {
        System.out.println("첫번째 작업 진행중...");
        try {
            Thread.sleep(2000); // 2초 동안 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("첫번째 작업 완료");
    }

    public static void processTask2() {
        System.out.println("두번째 작업 진행중...");
        try {
            Thread.sleep(2000); // 2초 동안 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("두번째 작업 완료");
    }
}

 

main을 보면 "첫번째 작업 시작" 출력 후 메소드가 2개 실행되고 있다. 동기 처리 방식은 processTask1() 메소드의 실행이 완료되어야 processTask2() 메소드가 실행되는 순서로 진행된다. 따라서 출력 결과는 다음과 같다.

첫번째 작업 시작
첫번째 작업 진행중...
첫번째 작업 완료
두번째 작업 진행중...
두번째 작업 완료
작업 완료

 

 

비동기 (Asynchronous)

 

비동기는 작업이 동시에 또는 병렬적으로 실행될 수 있는 방식을 말한다. 따라서 하나의 작업이 완료되기를 기다리지 않고 다른 작업을 동시에 실행할 수 있다. 일반적으로 JavaScript에서는 콜백 함수나 Promise 같은 메커니즘을 사용하여 작업의 완료를 처리한다. 앞서 말했듯이, Java는 동기 방식이기 때문에 인터페이스나 클래스를 사용한다. ExecutorService 인터페이스를 사용하는 비동기 처리 예시를 보자.

 

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AsyncExample3 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        System.out.println("첫번째 작업 시작");
        executorService.execute(() -> processTask1());

        System.out.println("두번째 작업 시작");
        executorService.execute(() -> processTask2());

        // 작업 완료 후 스레드 풀 종료
        executorService.shutdown();
        while (!executorService.isTerminated()) {
            // 모든 작업이 완료될 때까지 대기
        }

        System.out.println("작업 완료");
    }

    public static void processTask1() {
        System.out.println("첫번째 작업 진행중...");
        try {
            Thread.sleep(2000); // 2초 동안 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("첫번째 작업 완료");
    }

    public static void processTask2() {
        System.out.println("두번째 작업 진행중...");
        try {
            Thread.sleep(2000); // 2초 동안 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("두번째 작업 완료");
    }
}

 

멀티 스레드 환경에서 비동기 방식을 테스트 해봤다. 비동기 방식으로 처리하게 되면 processTask1() 메소드와 processTask2() 메소드가 끝나는 시간을 예상할 수 없기 때문에 다음과 같은 출력 결과를 얻을 수도 있다.

비동기 방식에서는 첫번째 작업과 두번째 작업이 동시에 진행된다. 따라서 끝나는 메소드에 따라 "첫번째 작업 완료" 출력이 먼저 될 수도 있고, 나중에 될 수도 있다.

 

동기 방식과 비동기 방식에는 각각의 장점이 있다. 동기 방식은 실행 결과를 쉽게 예측할 수 있고, 비동기 방식은 여러 작업을 동시에 처리할 수 있다는 것이다. 작업의 순서가 중요하지 않은 경우라면 비동기 방식을 이용해 보는 것을 어떨까?

728x90
저작자표시 비영리 변경금지 (새창열림)

'Java' 카테고리의 다른 글

[Java] StringBuffer vs. StringBuilder  (0) 2024.04.11
[Java] 얕은 복사 vs 깊은 복사  (0) 2024.03.19
'Java' 카테고리의 다른 글
  • [Java] StringBuffer vs. StringBuilder
  • [Java] 얕은 복사 vs 깊은 복사
hxxzz
hxxzz
개발새발 안 되게 개발 노력 중
  • hxxzz
    개발새발
    hxxzz
  • 전체
    오늘
    어제
    • 분류 전체보기 (104)
      • Java (3)
      • Back-End (9)
        • Spring Boot (7)
        • DevOps (1)
        • Redis (1)
      • Computer Scrience (4)
        • Data Structrue (4)
        • Algorithm (0)
      • SQLD (3)
      • 코딩테스트 연습 (85)
        • Programmers (30)
        • 백준 (15)
        • etc. (0)
        • 99클럽 (40)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    LeetCode
    Stack
    스택
    SQLD
    백준
    dfs
    99클럽
    BFS
    til
    코딩테스트 준비
    프로그래머스
    redission
    N+1 문제
    개발자 취업
    Spring Boot
    자료구조
    java
    SQL
    SpringBoot
    jpa
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
hxxzz
[Java] 동기(Synchronous) vs 비동기(Asynchronous)
상단으로

티스토리툴바