자바에서 쓰레드 사용하는 법
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 |