IMCAT.DEV
로그인 가입
Java 중급 비동기

Java 자바에서의 스레드 기초

Java 자바에서의 스레드 기초 — 중급

자바에서의 스레드 기초

1. 도입 (왜 배워야 하는가)

자바에서의 스레드(Thread)는 프로그램이 동시에 여러 작업을 수행할 수 있도록 해주는 중요한 개념입니다. 멀티스레딩을 활용하면 사용자 인터페이스(UI)가 멈추지 않고 부드럽게 동작하거나, 서버가 여러 클라이언트의 요청을 동시에 처리할 수 있습니다. 예를 들어, 온라인 쇼핑몰에서 사용자가 장바구니에 상품을 추가하는 동안, 다른 사용자의 주문을 처리하는 것이 가능합니다.

스레드를 잘 활용하지 않으면, 프로그램은 단일 스레드로만 동작하게 되어 사용자 경험이 저하되고, 성능 문제를 야기할 수 있습니다. 또한, 멀티스레딩을 잘못 사용하면 데이터 무결성 문제나 교착 상태(Deadlock) 같은 복잡한 버그를 초래할 수 있습니다.

2. 핵심 개념 설명

  1. 스레드(Thread): 프로세스 내에서 실행되는 작업의 단위. 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
  2. - 비유: 하나의 큰 회사(프로세스) 안에 여러 팀(스레드)이 있는 구조로 생각할 수 있습니다. 각 팀은 독립적으로 작업을 수행합니다.

  3. 멀티스레딩(Multithreading): 여러 스레드를 동시에 실행하여 작업을 병렬로 처리하는 기술.
  4. - 비유: 여러 요리사가 동시에 여러 요리를 하는 주방과 같습니다.

  5. 스레드 상태(Thread States): 스레드는 여러 상태를 가질 수 있습니다. 주요 상태는 다음과 같습니다.
  6. | 상태 | 설명 | |---------------|----------------------------------------| | NEW | 스레드가 생성되었지만 시작되지 않은 상태 | | RUNNABLE | 스레드가 실행 중이거나 실행 가능한 상태 | | BLOCKED | 자원을 기다리는 상태 | | TERMINATED | 실행이 완료된 상태 |

    3. 기본 코드 예제

    아래는 자바에서 스레드를 생성하고 실행하는 가장 기본적인 방법을 보여주는 코드입니다.

    class MyThread extends Thread {
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println("스레드 실행 중: " + i);
                try {
                    Thread.sleep(1000); // 1초 대기
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public class ThreadExample {
        public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start(); // 스레드 시작
        }
    }

    실행 결과:

    스레드 실행 중: 0
    스레드 실행 중: 1
    스레드 실행 중: 2
    스레드 실행 중: 3
    스레드 실행 중: 4
    • MyThread 클래스는 Thread 클래스를 상속받고, run() 메소드를 오버라이드합니다.
    • for 루프에서 0부터 4까지의 숫자를 출력하며 1초씩 대기합니다.
    • main 메소드에서 MyThread 객체를 생성하고 start() 메소드를 호출하여 스레드를 시작합니다.
    • 4. 실전 활용 예제

    • UI 응답성 유지: GUI 애플리케이션에서 버튼 클릭 시 긴 작업을 스레드로 실행하여 UI가 멈추지 않도록 합니다.
    •    JButton button = new JButton("작업 시작");
         button.addActionListener(e -> {
             new Thread(() -> {
                 // 긴 작업 실행
             }).start();
         });
    • 서버 클라이언트 처리: 웹 서버에서 여러 클라이언트의 요청을 동시에 처리하기 위해 스레드를 사용합니다.
    •    class ClientHandler extends Thread {
             private Socket clientSocket;
             public ClientHandler(Socket socket) {
                 this.clientSocket = socket;
             }
             public void run() {
                 // 클라이언트 요청 처리 로직
             }
         }

      5. 흔한 실수와 주의사항

    • 스레드가 아닌 메인 스레드에서 긴 작업 수행:
    • - 잘못된 코드:

         // 메인 스레드에서 긴 작업 수행
         for (int i = 0; i < 1000000000; i++);

      - 올바른 코드:

         new Thread(() -> {
             for (int i = 0; i < 1000000000; i++);
         }).start();
    • 스레드 안전성 무시:
    • - 여러 스레드가 동시에 접근하는 공유 자원에 대한 동기화가 필요합니다. 동기화 없이 접근하면 데이터가 꼬일 수 있습니다.

      6. 정리

    • 스레드는 프로그램의 동시성을 높이고 사용자 경험을 개선하는 데 중요합니다.
    • 멀티스레딩은 여러 작업을 병렬로 처리할 수 있는 기술입니다.
    • 스레드의 상태를 이해하고 적절하게 관리하는 것이 중요합니다.
    • 다음에 학습하면 좋은 주제:

    • 스레드 동기화(Synchronization)
    • ExecutorService를 이용한 스레드 풀
    • CompletableFuture를 활용한 비동기 프로그래밍