JAVA 프로그래밍 16장 Thread

JAVA 프로그래밍 16장 Thread

Thread

concurrent 를 multithread 라고 표현한다. Thread 라는 것은 squencial 한 프로그램을 말한다.

논리적으로 하나의 flow 하나의 task만 진행이 된다 즉 single threaded program이라고 한다.

multithreaded program이라고 하면 여러 개의 논리적 flow가 진행되는 상황을 얘기한다.

프로그램을 수행하는 도중 여러 개의 task를 처리할 수 있는 것을 얘기한다.

CPU 차원에서 봤을 때는 하나가 실행되는 것이지만 OS 차원에서 봤을 때는 Multi

Reactive system인 경우 여러 개의 system을 모니터링 할 수 있는 센서마다 전담하고 있는 것들이 존재.

예를 들어 센서가 10개가 있다하면 센서 10개를 한 사람이 관찰을 해야 한다면 하나씩 쭉 관찰을 하게 된다.

만약 관찰을 하고 넘어갔는데 문제가 발생했는데 이를 해결하기 위해서 sequential 하기 때문에 반응이 늦다.

하지만 인당 하나의 task를 본다면 즉각적으로 반응적인 수행 할 수 있다.

Disadvantage

각각의 Thread는 독립적으로 돌아가야 한다. 그렇기 때문에 순서가 존재한다면 그 순서를 Control 해야 한다.

순서를 보장해야 한다. 임의로 이루어질 수 있는 문제점이 존재할 수 있다.

Interation과 Cooperation을 가지고 순서성, 상호 작용을 하면서 해야 하기 때문에 복잡한 메커니즘이 지원되어야 한다.

안전성 문제(safety Problem)

-> 은행계좌에 두 사람이 동시에 100만원을 인출하면 200만원을 인출할 수 있는가?

Liveness 문제

-> 나는 너를 원하고 너는 나를 원하고, 서로의 조건이 되는 문제가 발생 (아무것도 일어날 수 없는 상황)

Thread / Processes

Process 개념

concurrent 두 개의 task가 동시에 진행되고 있는 것으로 이해할 수 있다.

heavyweight 무겁다.

OS 에 의해 여러 개의 task가 동시에 진행된다. OS에 의한 처리는 별도의 프로그램.. 음악틀고, 웹틀고,,유튜브 틀고 등등

그 프로그램들 끼리 메모리를 공유할 필요는 없다. 각각의 프로그램이 OS에서 따로 돌아가고 있으므로 메모리

공유의 메커니즘을 제공하지 않는다. 이 Process 에서 저 process로 pipe를 통해서 보낼 수 있는 정도의 공유는 할 수 있다.

Thread

Java Virtual Machine에서 봤을 때 두 개의 task가 동시에 이루어지는 것

JVM이 관리를 하고, 하나의 프로그램을 하는 사람이 두 개의 Task가 공유하는 메모리를 두는 것.

크게 하나의 프로그램 안에 여러 개의 task가 이루어지며 공용의 메모리가 존재한다.

변수를 공유하거나 Object를 공유하도록 Support 하는 것.

그러므로 Process보다 Resource를 적게 먹는다. 그러므로 Lightweight 라는 것

Window 작업 관리자

프로세스 메뉴

Thread / Process

메모리 관점

Process는 별도의 메모리 영역에서 작동하는 것

Thread는 한 메모리 영역 안에서 작동하는 여러 개의 Task

Main Routine관점

Process는 각각 별도의 main을 가지고 있는 프로그램

Thread는 하나의 Main에서 subroutine이 존재하는 프로그램이다.

Creation of Threads

Thread라는 클래스를 상속받거나 Runnable 인터페이스를 Implements 하기도 한다.

Extending the Thread Class

run이라는 메소드를 override해서 사용하게 된다.

To start a new thread

Instance를 만들고 start를 수행한다. new MyTHread.start()로 시작

Simple counter

run에 해당하는 것이 로직이다. for(;;) 무한루프 InterruptedException이 발생하는 경우의 예외 처리를 해야 한다.

예외가 발생하지 않는다면 계속적으로 count를 증가시켜준다. sleep하는 시간에 진짜 자다가 일어나서 출력하고 더하고를 반복한다. Counter(0,1,33).start()로 선언한다. 0에서 1씩 증가하는데 0.033 초에 해당하는 delay를 준다. 두 개의 Thread가 동시에 수행된다. 이 결과를 화면을 통해서 보여주게 된다.

3배 정도 늦은 속도로 -1 되는 것들이 출력된다. 두 개의 task가 동시에 진행된다. main 프로그램은 끝나게 되고 concurrent하고 independent하게 수행된다.

Runable interface를 implements 하는 것

Thread라는 클래스를 상속받지 못하는 경우가 있다라는 것.

Runable Interface에도 마찬가지로 run이라는 메소드를 구현해야 한다. 다른 클래슬 extends 할 때는 Implements 할 수 밖에 없다.

new Thread(new MyThread()).start()

약간의 방법이 다른다.

동일하게 돌아가는 프로그램 하지만 Runnable을 Implements 한다. 이번에는 Thread.sleep이렇게 선언을 한다. 그리고 start 를 호출하는 방식이 다르다는 것을 유념하라고 하셨음!

Controlling Threads

State 개념. 어떤 상태에 있느냐. sleep의 상태에 있다가 수행하는 상태등 state를 파악해야 한다.

state를 Control 하는 것과 우선순위를 다루는 것도 있지만 이는 다루지 않겠다.

New 상태 Alive 상태 Dead 상태

Runnable은 실제로 프로그램이 수행되는 상태이고

Blocked는 겨울잠, 동면의 상태를 말한다.

Sleeping 상태가 큰 의미로 Blocked 상태를 말한다. Thread 하나를 Blocked 상태로 만드는 것은 사용자가 sleep이라는 메소드를 통해 구현하고 Runnable 상태로 바꾸기 위해서 start 메소드를 사용한다.

wait, notify, notifyAll 의 메소드도 있다!!

여러 메소드가 존재한다!!

Thread Priority and Scheduling

우선 순위를 줌으로 Control 할 수 있다.

Thread가 Control을 뺏기는 상태는 sleep, join, wait이라는 메소드를 사용할 떄.

time-slice 여러 수행 되는 프로그램들을 시간을 할당한다.

Safety and Liveness

safe 하다는 것은 일어날 일이 일어나서는 안됀다. 예금은 100만원인데 200만원을 인출하는 법. ㅋㅋ 어떤 object가 modify 하고 있는 중간에 다른 작업이 끼어들어면 안돼는 것이다.

Single thread 에서는 문제가 없다. race hazard & race condition 의 경우 동시에 무엇인가를 하려고 할 때 문제가 발생한다.

thread safe

state의 consistency가 유지되는 상황을 말한다.

critical region

두 개 이상의 thread가 동시에 수행되지 못하는 상태를 말한다,

Synchronization mechanism

두 개의 thread가 동시에 수행될 수 없도록 도와주는 메카니즘을 말한다.

Atomic operation

하나의 operation의 경우 atomic operation. 어떤 함수가 진행될 때 다른 프로젝트가 동시에 진행된 다는 것이 없는 것을 전제로 했음. 특별히 조치하지 않아도 critical region을 보장한다는 개념(***) 그렇지 않은 경우 명시해줘야 한다. - > synchronized 라는 것을 사용

synchronized void aMethod

critical retion을 보장한다는 것을 명시적으로 표현하는 것

lock

하나의 Thread는 critical region에 들어가면 lock은 하나밖에 존재하지 않는다. exclusive possesion을 해야 하나의 task를 수행할 수 있다. 해당 Thread가 critical region을 떠나면 lock을 돌려주게 된다.

from http://handong201.tistory.com/87 by ccl(A) rewrite - 2021-12-12 18:28:00