ㅇTL

19- Threads 본문

2-1/객체지향 - java

19- Threads

정노르레기 2022. 5. 31. 21:33

프로세스

메모리를 할당받아 실행중인 프로그램. 운영체제로부터 실행에 필요한 메모리를 할당받아 어플리케이션의 코드를 실행

Thread

- 하나의 프로세스 내부에서 독립적으로 실행되는 작업 단위. 프로세스 내에서 실행되는 흐름의 단위.

- 프로세스 내부에 thread가 한개 -> 단일 스레드. single thread / 두개 이상 -> multi Thread - 서로 독립적. 오류발생해도 서로 영향x

- 하나의 스레드 내부에서 작업 처리 단계는 순차적!

 

-JVM에 의해 하나의 프로세스 발생 -> 메인 쓰레드가 main함수 실행하면서 어플리케이션 실행됨

여기에 다른 thread가 없을 경우 single thread 이고,

메인 스레드 내에서 다른 thread들을 만들게 되면 multiThread되는거임 (main method안에서 thread 호출)

 

MultiThread 

: 프로세스가 두개 이상의 서브 프로세스로 나누어져서 동시에 병렬로 구현될 수 있는 프로그래밍 개념. 

걍 여러 thread를 써서 한번에 여러 작업 처리하는 것

-> 병렬 (동시 실행) 처리 가능, cpu의 유휴시간 활용 가능, 우선순위에 따른 작업 순서 지정 가능

 

-> run안에 for문잇어도 그걸 한번에쭉실행하는게아니라 왓다갓다하면서 한다

 

Thread  만들기

1. Thread class를 상속받는다

public class ThreadName1 extends Thread{ ~ } 이렇게 Thread를 상속한 클래스를 만든다

2. Runnable interface를 구현한다

public class ThreadName2 implements Runnable{ ~ } 이렇게 Runnable을 implement한 클래스를 만든다

 

두 class에는 모두 run이라는 함수존재함

-> 실행할 내용을 이 함수에 적어준다

public void run(){ ~ }

 

그리고 이제 메인에서 새 객체 new 한 담에 .start()하면 스레드 실행!

1. Thread 상속

ThreadName1 t1=new ThreadName1(); // 걍 이렇게 평범하게 new 해주면 됨

t1.start();

2. Runnable 인터페이스

Thread t2=new Thread(new ThreadName2()); //이렇게 new Thread의 매개변수로 넣어줘야함 !!

t2.start();

 

(Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없으므로, 일반적으로 Runnable 인터페이스를 구현하는 방법으로 스레드를 생성합니다.)

 

Thread LifeCycle

 

1. Runnable : 준비상태

- CPU를 점유하여 실행하기 위해 대기하고 있는 상태 ! (Running 이전)

- start()호출하면 run()메소드에 설정된 스레드가 Runnable 상태 진입

걍 start()하면 해당 스레드가 준비상태가 된다

 

2. Running : 실행 상태

- CPU를 점유하여 실행중인 상태

- Runnable상태의 여러 thread중 우선순위를 가진 thread가 결정되면 JVM이 자동으로 run() 호출하여 thread가 Running 상태 진입

어떤걸 먼저 실행할지 결정하면 자동으로 run()실행하며 running된다

 

3. Dead : 종료 상태

- 스레드가 모두 실행된 후 완료되엇거나 , kill된 상태

 

4. Blocked : 지연 상태

- CPU 점유권을 상실

- sleep() 메소드에 의해 블럭되면 일정 시간 지나면 다시 runnable됨

- wait() 메소드에 의해 블럭되면 notify() 호출되면 다시 runnable됨

- I/O 관련 메소드에 의해 I/O Blocked된거면 그거 메소드 실행끝나면 다시 runnable됨

 

Priority

: Thread에 우선순위 지정 가능 ! -> 실행 순서에 영향을 준다

ThreadName.setPriority(int값) 을 통해 우선순위 설정함 - 그냥 Main에서 하면 됨!-> 이때 1~10 지정 가능

• 정의되어 있는 우선순위 상수

 - MIN_PRIORITY: 1

 - NORM_PRIORITY: 5 (default임!)

 - MAX_PRIORITY: 10

 

(단지 우선순위가 높은 스레드는 우선순위가 낮은 스레드보다 좀 더 많이 실행 큐에 포함되어, 좀 더 많은 작업 시간을 할당받을 뿐임 )

 

Syschronization (동기화)

동기화-> 다중 thread에 의한 공유 자원 접근을 제어할 수 잇당 (-> thread 간섭 방지, 일관성 문제 방지, 데이터 변형 방지 를 해준당)= 여러 스레드가 동일한 리소스에 접근할때 걸어준다. 하나의 스레드만 한번에 한 리소스 사용할 수 있도록

 

race condition 문제 ! 여러 thread가 공동의 자원에 접근할 때 예측불가한 문제가 생길 수 ㅣㅇㅆ느 ㄴ것

 

원래 multiThreading -> 비동기 ! -> 필요할 경우 강제로 사용함 synchronized 키워드 사용- method에서 void앞에 적어둠- 함수안에서 동기화 할 부분에 synchronized(this){ ~~ } 해도 됨

 

동기화 동작

- Thread가 동기화된 메소드 실행하면 자동으로 해당객체(사용하는 자원)에 대한 lock을 획득

- 메소드 끝나면 lock 해제

- 동시간에 하나의 thread에만 lock가질 수 ㅇ

 

-한번에 하나의 thread만 객체에 대한 작업을 수행할 수 있도록 함

- 여러 thread가 객체에 접근하려할 때 동기화는 일관성을 유지하는데 도움줌!

 

동기화시 필요한 것

- synchronized 키워드

- wait() : 스레드를 blocked상태로 전환함 (=lock해제) 이제 잠들러가는 것. 해당 스레드 멈춤

- notify() / notifyAll() : 스레드를 active상태로 전환. all은 전부고, all없는건 아무거나 함 -> 걍 notifyAll하기

 

 

 

'2-1 > 객체지향 - java' 카테고리의 다른 글

14- ArrayList , Generics  (0) 2022.06.13
Interfaces and Inner Classes  (0) 2022.06.02
Chap 9. Exception handling  (0) 2022.05.30
Polymorphism and abstract classes  (0) 2022.04.20
Chap 7. Inheritance (상속)  (0) 2022.04.12