열심히 끝까지

43강 스레드2 본문

멘토씨리즈 JAVA

43강 스레드2

노유림 2022. 5. 10. 23:48

<복습>
스레드
하나의 프로세스 안에서 두 가지 이상의 일을 하도록 하는 것

<용어 정리>
프로세스(Process)              : 실행 중인 프로그램
스레드(Thread)                  : 프로세스에서 작업을 수행하는 것
멀티 스레드 프로세스(Multi-Thread Process)
                                         : 두 가지 이상의 작업을 하는 프로세스

[스레드 생성 방법]
자바 스레드로 작동할 작업이 무엇인지 코드로 작성
1) Thread 클래스 상속
2) Runnable 인터페이스 구현

스레드 코드가 실행할 수 있도록 JVM한테 요청
1) 인스턴스 생성 후 start() 호출
2) 인스턴스 생성 후 Thread() 매개변수 생성자에 인자값 전달, start() 호출

1) Thread 클래스 상속
class T1 extends Thread{
       public void run(){
              // 작업할 내용
       }
}

Th1 t1 = new Th1();
t1.start();
------------------------
2) Runnable 인터페이스 구현
class T2 implements Runnable{
       public void run(){
              // 작업할 내용
       }
}

Th2 t2 = new Th2();
Thread t = new Thread();

t.start();
---------------------------------------------------------------------
43-1 ) 스레드의 우선순위
: 스레드는 시분할 방식으로 CPU의 시간을 분배하여 실행하지만
  사용자가 직접 스레드의 우선순위를 지정해서 특정 스레드에 더 많은
  실행시간 부여 가능

<우선순위 지정 메서드>
void setPriority(int new Priority)   우선 순위 지정
int getPriority                           우선 순위 반환

우선순위는 1부터 10까지 부여 가능
설정하지 않을 경우 기본적으로 5
       
<실습>Thread2
우선순위에 따른 스레드의 동작 실습


43-2 ) 스레드의 라이프 사이클
: 스레드는 현재 상태에 따라 네 가지 상태로 분류할 수 있으며
  상태가 변화하는 주기를 Life Cycle이라고 한다.

<스레드 상태>
new : 스레드가 키워드 new를 통해서 인스턴스화된 상태
           Runnable이 될 수 있는 상태이며 아직 대기열에 올라가지 못한 상태

Runnable : start() 메서드가 호출되면 new 상태에서 Runnable 상태가 된다.
                  Runnable상태가 되면 실행할 수 있는 상태로 대기하게 되며
                  스케줄러에 의해 선택되면 run()메서드를 바로 수행

Blocked 실행중인 스레드가 sleep(), join() 메서드를 호출하게 되면,
                Blocked 상태가 된다. Blocked 상태가 되면 스케줄러에 의해서
                선택받을 수 없다.

Dead : run()메서드의 실행을 모두 완료하게 되면 스레드는 Dead상태가 된다.
            할당받은 메모리와 정보 모두 삭제된다.

<스레드의 생명주기(Thread Life Cycle)
new Thread() -> new -> start() -> Runnable 
-> JVM Schaduler -> Running -> sleep() or join() 
-> Time_Waiting or Blocked -> unblocked -> Runnable
-> JVM Schaduler -> Running -> Dead


스레드를 Blocked 상태로 만드는 메서드
[1] sleep()
스레드를 지정한 시간 동안 block상태로 만든다.
  시간은 1000분의 1초까지 지정할 수 있으며, 지정된 시간이 지나면
  다시 runnable(실행 가능한)상태로 돌아간다.

<실습> Sleep2
sleep()의 block 효과를 이용한 카운트다운



[2] yield()
자신의 시간을 양보하는 메서드
  스레드가 작업을 수행하던 중 yield()를 만나면,
  자신에게 할당된 시간을 다음 차례 스레드에게 양도

<실습>Yield1
★를 찍는 스레드가 yield()메서드를 호출 시 결과

실행결과



[3] join()
특정한 스레드가 작업을 먼저 수행할 때 사용
  실행 순서를 지켜야 하는 스레드를 제어

<실습>Join1
join()메서드를 알아보는 코드