멀티쓰레드 프로그래밍

이재연·2021년 2월 21일
0

Java Basic

목록 보기
10/15

프로세스란?

OS에서 자원을 받아 실행되는 하나의 프로그램이라고 생각하면 된다. 한 프로세스에는 여러개의 쓰레드가 존재 할 수 있다.

쓰레드란?

프로세스 내에서 실행되는 흐름의 단위이다. 한 프로세스의 쓰레드들은 프로세스의 자원을 공유한다.

  • 자바에서의 쓰레드

하나의 메인 쓰레드가 존재한다.
Runnable 인터페이스 상속 혹은 Thread 클래스 확장으로 사용자가 원하는 쓰레드를 구현 할 수 있다.

Thread 클래스와 Runnable 인터페이스

  • Runnable 인터페이스

run 메소드 하나만 있는 인터페이스이다.

run()에 원하는 기능을 Override해서 원하는 쓰레드를 생성할 수 있다.

  • Thread 클래스

Runnable을 구현한 클래스이다.

  • run()start()

run()은 쓰레드를 호출한다.

start()는 쓰레드를 위한 별도의 콜스택을 생성한 다음 호출한다.

start()를 사용하면 독립적인 콜스택을 가지기 때문에 병행 처리가 가능해진다.

쓰레드의 상태

NEW : 쓰레드 객체가 생성되었지만 시작되지 않은 상태

RUNNABLE : 쓰레드가 실행중인 상태

BLOCKED : 쓰레드 실행 중지 상태, 락이 풀리기를 기다리는 상태

WAITING : 대기상태, 아직 종료되지 않은 상태이다.

TIME_WAITING : 시간만큼 대기중인 상태, 역시 아직 종료되지 않았다.

TERMINATED : 종료상태

쓰레드의 우선순위

자바에서는 쓰레드의 우선순위를 설정할 수 있다. 1~10 값을 가질 수 있으며 기본값은 5이고 값이 높을수록 우선적으로 실행순위를 얻습니다.

Main 쓰레드

자바 애플리케이션은 기본적으로 하나의 메인 쓰레드를 가진다.

자바의 main() 메소드가 메인 쓰레드가 되며 메인 메소드만 실행하는 것을 싱글 쓰레드 애플리케이션이라고 한다.

  • 데몬 쓰레드

메인 쓰레드의 작업을 돕는 보조적인 쓰레드. 메인 쓰레드가 종료되면 데몬쓰레드는 종료된다.

동기화

여러개의 쓰레드가 한 개의 리소스를 사용할 때 다른 쓰레드의 접근을 막는 것

자바에서 동기화를 하는 방법 중 synchronized 키워드를 이용한 방법이다.

메소드나 블록단위로 synchronized를 설정할 수 있다.

public synchronized void work(){
	...
}

public void work2(){
	synchronized(otherObject){
		...
	}
}

데드락

둘 이상의 쓰레드가 lock을 획득하기 위해 대기하는데 서로 다른 lock을 기다리면서 무한 대기에 놓이는 상황이다.

데드락이 빠지려면 아래의 4가지 조건이 모두 만족해야 한다.

상호배제 : 한 자원에 대해 하나의 쓰레드만 접근 가능하다.
점유와 대기 : 자원을 점유한 채로 다른 자원을 점유하기 위해 대기한다.
비선점 : 다른 쓰레드의 자원을 강제로 가져올 수 없다.
환형대기 : 각 쓰레드가 순환적으로 자원을 요구한다.

0개의 댓글