[Java] 멀티쓰레드 프로그래밍

Manx·2022년 4월 28일
0

Java

목록 보기
1/2

Thread 클래스와 Runnable 인터페이스

쓰레드를 구현하는 방법은 두 가지 방법이 있다.
1. Thread 클래스를 상속받는 방법
2. Runnable 인터페이스를 구현하는 방법

Runnable은 run() 메서드만 구현되어 있는 함수형 인터페이스다.

Thread 클래스가 다른 클래스를 확장할 필요가 있을 경우에는 Runnable 인터페이스를 구현하고,
그렇지 않은 경우는 Thread 클래스를 사용하는 것이 편리하다.
(Runnable 인터페이스를 구현하는 방법이 일반적인 방법)

start(), run()

쓰레드를 실행하기 위해서는 start메서드를 통해 해당 쓰레드를 호출해야 한다.
start 메서드는 쓰레드가 작업을 실행할 호출 스택을 만들고 그 안에 run 메서드를 올려주는 역할을 한다.
start 메서드를 호출하지 않고, run 메서드를 호출하면, 새로운 호출 스택이 생성되지 않기 때문에 순차적으로 실행된다.

쓰레드의 상태

스케줄링을 통해 자원과 시간을 낭비하지 않아야 한다.

상태열거 상수설명
객체 생성NEW쓰레드 객체가 생성, 아직 start()메소가 호출되지 않은 상태
실행 대기RUNNABLE실행 상태로 언제든지 갈 수 있는 상태
일시 정지WAITING
TIMED_WAITING
BLOCKED
다른 스레드가 통지할 때 까지 기다리는 상태
주어진 시간 동안 기다리는 상태
사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태
종료TERMINATED실행을 마친 상태

쓰레드의 상태는 메서드를 통해 제어할 수 있다.

  1. start 메서드를 통해 쓰레드를 실행 가능한 상태로 만든다.
  2. run 메서드에 의해 코드가 실행된다.
  3. 모든 작업을 마치면 TERMINATED 상태가 되지만, 메서드를 이용해 쓰레드를 정지시키거나 다시 실행할 수 있다.
메서드설명
static void sleep(long mills)
static void sleep(long millis, int nanos)
지정된 시간동안 쓰레드를 일시 정지.
자동적으로 다시 실행 대기 상태가 됨
void join()
void join(long millis)
void join(long millis, int nanos)
해당 쓰레드가 종료되기까지 기다렸다가 다음으로 넘어간다.
void interrupt()sleep()이나 join()에 의해 일시정지 상태인 쓰레드를 깨워서 실행대기 상태로 만든다. 해당 쓰레드에서는 InterruptedException이 발생함으로써 일시정지 상태를 벗어나게 된다.
void stop()쓰레드를 즉시 종료
void suspend()쓰레드를 일시 정지
void resume()suspend()에 의해 일시정지 상태에 있는 쓰레드를 실행대기 상태로 만든다.
static void yield()실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기 상태가 된다.

resume, stop, suspend는 교착상태(dead-lock)로 만들 수 있어 사용되지 않는다.

쓰레드 우선순위

  • static int MAX_PROIORITY : 최대 우선순위
  • static int MIN_PRIORITY : 최소 우선순위
  • static int NORM_RPIORITY : 기본 우선순위

getPriority()와 setPriority() 메서드를 통해 쓰레드의 우선순위를 반환하거나 변경할 수 있다.
우선순위의 범위는 1~10 이며, 숫자가 높을수록 우선순위가 높다.
main() 메서드를 실행하는 쓰레드의 우선순위는 언제나 5이다.

Main Thread

따로 쓰레드를 실행하지 않고 main() 메서드만 실행하는 것을 싱글쓰레드 애플리케이션이라고 한다.
멀티 쓰레드 애플리케이션

Daemon Thread

main 쓰레드의 작업을 돕는 보조적인 역할을 하는 쓰레드이다.
main 쓰레드가 종료되면 Daemon Thread는 강제적으로 자동 종료됨

동기화(Synchronize)

여러 개의 쓰레드가 한 개의 리소스를 사용하려고 할 때 사용하려는 쓰레드를 제외한 나머지들의 접근을 막는 것
쓰레드에서 안전하다고 표현 (Thread-safe)

  • Synchronized
  • Atomic
  • Volatile

Reference

profile
백엔드 개발자

0개의 댓글