BE/Java

[Java] 쓰레드

baek-dev 2024. 12. 22. 12:28

자바에서 쓰레드 사용하는 법

 

1. Thread 클래스를 상속받는 방법

  • java.lang.Thread 클래스를 상속받아 생성하고 실행
class MyThread extends Thread {
    @Override
    public void run() {
        // 스레드의 작업 내용
        System.out.println("Thread is running!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 스레드 시작
    }
}
  • start() 메서드 : 쓰레드를 시작하고, 내부적으로 run() 메세드를 호출
  • run() 메서드 : 쓰레드가 수행할 작업을 정의

2. Runnable 인터페이스를 구현하는 방법

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable thread is running!");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}
  • 차이점
    • Runnable은 다른 클래스를 상속받을 수 있으므로 유연성이 높음
    • Thread 상속 방식은 단일 상속만 가능

3. 람다 표현식으로 간단히 구현

  • 간단한 작업은 람다 표현식을 사용하여 바로 쓰레드를 생성
public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> System.out.println("Lambda thread is running!"));
        thread.start();
    }
}

쓰레드의 주요 속성과 메서드

1. 쓰레드 생성 관련 속성

속성 설명
name 쓰레드의 이름을 설정하거나 가져온다
priority 쓰레드 우선순위를 설정한다 ( 1 - 10, 기본값 5)
daemon 쓰레드가 데몬(백그라운드) 쓰레드 인지 여부를 설정
state 쓰레드의 현재 상태 (NEW, RUNNABLE, BLOCKED 등)
id 쓰레드의 고유 ID

2. 주요 메서드

메서드 설명
start() 쓰레드를 시작하고 run() 메서드를 호출
run() 쓰레드가 실행할 작업을 정의
sleep(long ms) 쓰레드를 지정된 시간(ms) 동안 일시 중단
join() 다른 쓰레드가 종료될 때까지 현재 쓰레드가 대기
interrupt() 쓰레드의 실행을 중단하려고 시도
isAlive() 쓰레드가 실행중인지 확인
setPriority(int p) 쓰레드의 우선순위를 설정. (우선순위가 높을수록 실행 기회가 많아질 수 있음, 하지만 보장되지 않음)

쓰레드의 상태

상태 설명
NEW 쓰레드가 생성되었지만 아직 start() 메서드가 호출되지 않은 상태
RUNNABLE 실행 가능한 상태 (실제로 실행 중인지 여부는 JVM 스케줄러에 따라 결정)
BLOCKED 다른 쓰레드가 자원을 점유하고 있어 대기 중인 상태
WAITING 다른 쓰레드의 신호를 기다리는 상태
TIMED, WAITING 지정된 시간 동안 대기하는 상태. (sleep(), join(long) 등 호출 시)
TERMINATED 쓰레드가 작업을 마치고 종료된 상태

쓰레드 동기화

멀티쓰레딩에서는 여러 쓰레드가 동시에 데이터를 변경하거나 읽으면 데이터 불일치 문제가 발생할 수 있다.

이를 방지하기위해 동기화가 필요하다

1. 동기화 블록

synchronized (lock) {
    // 동기화가 필요한 코드
}

2. 동기화 메서드

public synchronized void method() {
    // 동기화가 필요한 코드
}

3. 동기화 문제 예제

  • 문제 상황 : 여러 쓰레드가 은행 계좌의 잔액을 동시에 변경하면, 잔액 계산이 엉망이 될 수 있음
  • 해결 방법 : 동기화를 통해 한번에 한 쓰레드만 작업하도록 제한

정리

1. 스레드란:

  • 실행 흐름의 단위로, 하나의 프로세스에서 여러 스레드를 생성해 동시에 작업 가능

2. 스레드 생성 방법:

  • Thread 클래스 상속
  • Runnable 인터페이스 구현
  • 람다 표현식 활용

3. 주요 메서드와 속성:

  • start(), run(), sleep(), join(), interrupt() 등
  • name, priority, state 등의 속성 활용 가능

4. 멀티스레딩 문제 해결:

  • 동기화(synchronized)를 통해 데이터 충돌 방지

 

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] @Builder, @ToString, @EqualsAndHashCode, @Singular  (0) 2024.12.23
[Java] 프록시  (0) 2024.12.22
[Java] StringBuffer, StringBuilder  (1) 2024.12.19
[Java] 영속성  (0) 2024.12.16
[Java] 레이어드 아키텍처와 mvc  (1) 2024.12.15