[Java] Process, Thread

2020. 7. 13. 18:17Language/Java

1. Process

실행중인 프로그램으로  OS로 부터 메모리를 할당 받는다.

 

 

 

2. Thread

실제 프로그램이 수행되는 작업의 최소 단위이다. 하나의 Process는 하나 이상의 Thread를 가지게 된다(ex. 화면 쓰레드와 백그라운드 다운로드 쓰레드).

Process, Thread 도식화

1) Java Thread 클래스로 부터 상속받아 구현

ThreadTest

2) Runnable 인터페이스 구현

ThreadTest2

 

 

 

3. interrupt 메서드

다른 Thread에 예외를 발생시키는 interrupt를 보낸다. Thread가 join, sleep, wait 메서드에 의해 블락되었다면 interrupt에 의해 다시 runnable 상태가 될 수 있다.

InterruptTest

 

 

 

4. Thread 종료

데몬과 같이 무한 반복하는 Thread가 종료될 수 있도록 run 메서드 내의 while문을 활용한다. Thread.stop()은 사용하지 않는다.

TerminateThread

 

 

 

5. Multi-thread 프로그래밍

동시에 여러 개의 Thread가 수행되는 프로그램이다. Thread는 각각의 작업공간(Context)를 가지고, 공유 자원이 있는 경우 Race condition이 발생한다. critical section에 대한 동기화의 구현이 필요하다.

Critical Section 도식화

※ 각 Thread가 공유하는 자원인 Shared Resource 영역은 Critical Section이라 하며, 각 Thread의 충돌(Race condition)을 방지하기 위해 순서를 정하는 동기화 과정이 필요하다(Critical Section에 들어갈 Thread는 한번에 한 개씩이여야 함).

 

 

 

6. 동기화

여러 Thread가 접근할 때 Thread가 수행 하는 동안 공유 자원을 Lock하여 다른 Thread의 접근을 방지한다. 동기화를 잘못 구현하면 Deadlock에 빠질 수 있다.

 

1) 동기화 전

동기화가 이루어지지 않기 때문에 올바른 결과값이 나오지 못한다.

SyncTest
구현 화면

2) 동기화 후 (Synchronized 메서드)

참조형 수식에 해당하는 객체에 Lock한다.

SyncTest

3) 동기화 후 (Synchronized 수행문)

메서드보다 더 선호하며, 현재 해당 메서드가 속해 있는 객체에 Lock한다. Deadlock을 방지하기 위해 Synchronized 메서드 내에서 다른 Synchronized 메서드를 호출하지 않는다.

SyncTest

4) 동기화 후 (run 메서드 동기화)

run 메서드에 synchronized 메서드를 적용하는 경우가 있지만, Shared Resource가 해당 run 메서드가 구현된 클래스가 되기 때문에 적용이 안된다.

SyncTest
구현 화면

※ Java에서 일반적으로 공유하는 자원은 static 키워드를 가진 객체이다.

 

 

 

7. DeadLock

서로 대기하는 상태이다.

DeadLock, wait/notify 예시 도식화
LibraryMain

1) wait

리소스가 유효하지 않은 경우 리소스가 사용 가능할 때 까지 Thread를 non-runnable 상태로 전환한다. wait상태가 된 Thread는 notify가 호출 될 때가지 대기한다.

2) notify

wait하고 있는 Thread 중 한 Thread를 runnable한 상태로 깨운다. 한번에 한개씩 수행한다.

구현 화면

3) notifyAll

wait하고 있는 모든 Thread가 runnable 상태로 전환한다. notify보다 notifyAll을 사용하기를 권장한다. 특정 Thread가 통지를 받도록 제어 할 수 없으므로 모두 깨운 후 Scheduler에 CPU를 점유하는 것이 좀 더 공평하다

LibraryMain
구현 화면


[참고] github.com/ozofweird/Java_Practice

 

 

728x90

'Language > Java' 카테고리의 다른 글

[Java] 객체지향 5대 원칙 SOLID  (0) 2020.11.02
[Java] 명명 규칙  (0) 2020.07.21
[Java] 그 외 입출력 클래스와 데코레이터 패턴  (0) 2020.07.13
[Java] 직렬화  (0) 2020.07.13