코딩항해기

[JAVA] 스레드 Thread 본문

JAVA

[JAVA] 스레드 Thread

miniBcake 2024. 7. 28. 15:50

 

 

스레드

하나의 프로세스 내에서 작업을 처리하는 흐름의 단위이다.

스레드는 생성, 실행, 종료되기까지 다양한 상태를 가지며, 각 스레드의 상태는 스레드 클래스에 정의되어있다.

Thread.State로 타입을 알 수 있다.

상태 상수 설명
생성 NEW 스레드 객체가 생성되었지만 아직 start() 메서드가 생성되지 않은 상태 이다.
대기 RUNNABLE 실행 대기 또는 실행 상태로 언제든지 갈 수 있는 상태 이다.
일시정지 WATING 다른 스레드가 종료될 때까지 대기하는 상태 이다.
TIMED_WATING 주어진 시간동안 대기하는 상태 이다.
BLOCKED 락이 풀릴 때까지 대기하는 상태 이다.
종료 TERMINATED 수행을 종료한 상태 이다.

 

 

프로세스

프로세스는 컴퓨터에서 실행 중인 프로그램을 의미하며, 프로그램이 실행되면 운영 체제에 의해 하나의 프로세스로 관리된다. 프로세스는 프로그램을 실행시키기 위한 메모리 등의 자원과 스레드로 구성된다.

 

프로그램 (소프트웨어)

컴퓨터나 다른 전자 기기에서 특정 작업을 수행하기 위해 작성된 명령어들의 집합이다.

 

 

싱글스레드

프로그램을 동작하는데 하나의 스레드만 사용된다.

스레드를 한 개만 가지고 있기 때문에 작업을 순차적으로 처리하므로 상대적으로 비효율적이다.

싱글 스레드는 혼자서 자원을 사용하기므로 동기화를 걱정할 필요가 없으며, 안정성이 높고 설계가 쉽다.

 

멀티스레드

메인스레드가 작업을 마치더라도 다른 스레드의 작업이 모두 끝나야만 프로그램이 종료된다.

하나의 프로세스에서 여러 작업을 동시에 처리하는 것처럼 보이지만, 각각의 스레드를 매우 빠른 속도로 번갈아가면서 실행시켜 작업을 진행한다. 안정성이 떨어지고 설계가 어렵다.

스레드 간 공유하는 자원이 있다면 충돌이 생길 수 있으며, 이런 문제를 동기화(Synchronized)를 통해 해결 할 수 있다.

 

 

멀티스레드 구현 방법

멀티 스레드를 구현하기 위해서는 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현해야한다.

Thread 클래스는 기능이 전부 구현되어있고, Runnable인터페이스는 run() 메서드를 반드시 구현해야하는 차이점이 있다.

(강제성 유무의 차이)

run() 메서드를 오버라이딩하여 스레드가 처리할 작업을 재정의하면, start() 메서드로 스레드 실행할 수 있다.

 

멀티스레드 관련 메서드

currentThread() 스레드 객체의 참조 메서드이다.
getName() 스레드 이름 반환하는 메서드이다.
setName("스레드 이름"); "스레드 이름"으로 스레드명칭 변경하는 메서드이다.
run() 스레드가 호출하는 메서드이다.
start() 스레드를 실행시키며, run() 메소드를 호출한다.
sleep(long milis) 매개변수로 전달한 시간동안 스레드를 멈춘다.
join() 현재 스레드의 작업을 멈추고 join을 사용한 스레드를 기다린다.
매개변수에 값을 전달하지 않으면 현재 스레드가 join을 사용한 스레드의 작업이 끝날 때까지 기다린다.
join(long milis) 매개변수에 값 동안 기다렸다가 현재 스레드를 다시 실행한다.
보통 먼저 실행시킬 스레드를 사용한다.
wait() 스레드를 대기시킨다.
notify() 대기시킨 스레드를 다시 실행시킨다.

 

 

Lock

스레드가 공유되는 자원을 사용할 때 생기는 문제를 동기화로 해결한다.

이 때 하나의 자원에 하나의 스레드만 접근하기 위해서 사용하는 개념이 lock이다.

자바의 모든 객체는 하나의 lock을 가지고 있다 동기화된 영역을 스레드가 사용하기 위해서는 lock을 획득해야만 하며 동기화 영역을 벗어나면 lock을 반납하고 다른 스레드가 lock을 가져와서 자원을 사용한다.

 

동기화 (Synchronization)

A스레드와 B스레드가 작업을 진행할 때, A가 사용 중인 자원을 B가 사용하여 변경한다면, A의 작업 의도와는 다르게 결과가 나타날 수 있다. 이러한 문제를 방지하기 위해 하나의 자원을 여러 스레드가 동시에 접근하지 못하게 막는 것을 동기화라고 한다.

 

동기화 영역 만들기

//동기화 블록
synchronized(객체명){}

 

일부 소스코드만 동기화를 걸어준다.

스레드는 지정된 객체의 lock을 얻어내며 해당 객체의 lock을 가진 스레드만 동기화 블록에 접근 가능하다.

//동기화 메소드
public synchronized 메서드명(){}

 

해당 메서드 전체에 동기화를 걸어준다.

'JAVA' 카테고리의 다른 글

[JAVA] POJO  (0) 2024.08.21
[JAVA] 파일 입출력  (0) 2024.07.29
[JAVA] 람다식 (익명 메서드) (+함수형 인터페이스)  (0) 2024.07.27
[JAVA] 사용자 정의 예외  (0) 2024.07.25
[JAVA] 2차원 배열  (0) 2024.07.25