-
10주차 과제: 멀티쓰레드 프로그래밍 #10JAVA 기본 2021. 2. 28. 01:35728x90
목표
자바의 멀티쓰레드 프로그래밍에 대해 학습하세요.
학습할 것 (필수)
- Thread 클래스와 Runnable 인터페이스
- 쓰레드의 상태
- 쓰레드의 우선순위
- Main 쓰레드
- 동기화
- 데드락
기본 개념
1.프로세스
단순히 실행중인 프로그램을 의미
프로그램을 실행할려면 원도우로 부터 메모리를 할당받아 프로세스가 실행함
2.쓰레드
프로세스라는 공간에서 실제로 실행하는 일꾼
하나면 싱글쓰레드 2개이상이면 멀티 쓰레드
멀티쓰레딩에서 주의 할점
여러 쓰레드가 같은 환경에서 자원을 공유함으로써 교착상태와 동기화 같은 문제가 발생가능
추후에 알아봄
자바에서 쓰레드를 생성하는 방법
1. 쓰레드 클래스를 상속 받는다.
클래스를 쓰레드의 자식클래스로 선언하여 인스턴스 하는방법
2.Runnable 인터페이스를 구현하는 방법
클래스를 Runnable 인터페이스를 구현하는 클래스로선언하여 만드는것
그런 다음 해당 클래스는 run() 메소드를 구현합니다.
run() 메소드를 구현했다면 클래스의 인스턴스를 할당하고 Thread를 만들 때 인수로 전달하고 시작할 수 있습니다.
Thread클래스와 Runnable 인터페이스 모두 자바에서 쓰레드를 생성할때 사용하는 것이다.
Runnable 인터페이스란
함수형 인터페이스로 run()이라는 추상클래스 하나만 가지고 있다.
run메소드로 쓰레드에게 작업할 내용을 설정가능하다.
Thread 상태
효율적인 쓰레드를 만들기위해선 프로세스에게 주어진 자원을 잘 분배해서 사용해야함
그것을 위해 쓰레드 상태와 관련된 메소드를 알아야한다
NEW : 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE : 실행 중 또는 실행 가능한 상태
BLOCKED : 동기화 블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태)
WAITING, TIMED_WAITING : 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태, TIMED_WAITING은 일시정지시간이 지정된 경우를 의미한다.
TERMINATED : 쓰레드의 작업이 종료된 상태
쓰레드의 우선순위
작업 중요도에 따라 우선순위를 나누면 더 많은 작업시간을 가짐
쓰레드가 가질 수 있는 우선순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높습니다.
생성한 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받습니다.
main 메소드를 수행하는 쓰레드는 우선순위가 5이므로 main메소드 내에서 생성하는 쓰레드의 우선순위는 기본적으로 5가 됩니다.
Main 쓰레드
Java 프로그램을 실행하기 위해 Main Thread는 main() 메소드를 실행합니다. main() 메소드는 메인 쓰레드의 시작점을 선언하는 것입니다.
데몬쓰레드
다른 일반 쓰레드(사용자 쓰레드)의 작업을 돕는 보조적인 역할을 수행하는 쓰레드입니다. 사용자 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료됩니다.
동기화
한 쓰레드가 작업중인 공간을 다른 쓰레드가 접근하지 못하게하는것
접근하면 어떤 시점에서 접근하는가에 따라서 결과가 달라질 수 있다.
예를들어
10을 넣고 다음에 20을 넣는데 다른곳에서 동시에 10을 넣었다면 동기화가 되지않아 40을 나타내야하는데 마지막 작업인 20만 나타낼 수 있다.
데드락
교착상태
2개이상의 프로세스가 다른작업이 끝날 때 까지 기다리며 작업을 하지 않는 상황
발생원인 4가지
1.상호배제
서로의 자원을 공유하지 못할때
2.비선점
서로의 자원을 뺏을 수 없을때
3.점유와 대기
하나의 작업을 잡은 상태에서 다른 작업을 기다릴때
4.원형대기
자원을 요구하는 방향이 원을 이룰때
해결방법
1. 교차 사태를 이르키는 4가지 방법을 무력화시킴
2. 교착 상태가 발생하지 않는 수준으로 자원을 할당함
3. 자원 할당 그래프를 사용하여 교착 상태를 발견함
참고자료
'JAVA 기본' 카테고리의 다른 글
12주차 과제: 애노테이션 #12 (0) 2021.02.28 11주차 과제: Enum #11 (0) 2021.02.28 9주차 과제: 예외 처리 #9 (0) 2021.02.27 8주자 과제: 인터페이스 #8 (0) 2021.02.24 7주차 과제: 패키지 #7 (0) 2021.02.23