1cm

자바 프로그래밍_Day_22_스레드(Thread)2 본문

국비지원_Java/Java Programming_1

자바 프로그래밍_Day_22_스레드(Thread)2

dev_1cm 2021. 9. 25. 19:33
반응형

 


2021. 09. 15


     > 자바 스레드 스케쥴링 방식
       -> 스레드 개수가 코어의 수보다 많을 경우 스레드를 어떤 순서로 동시성을 실행할 것인가를 결정하는 것.
       -> 스케쥴링에 의해 스레드들은 번갈아가며 run()메소드를 조금씩 실행한다.


       -> 1. 우선 순위 방식 (Priority)
            -> 우선 순위가 높은 스레드가 작업 시간을 더 많이 가지도록 하는 스케쥴링 방식
            -> 스레드에 1 ~ 10까지 우선 순위 번호 부여 가능 (번호가 높을수록 우선 순위가 높음)
            -> 스레드 생성 시 우선 순위 기본값은 5

1
2
3
4
5
6
7
public class Run {
public static void main(String[] args) {
클래스명 레퍼런스 = new 생성자(); //Thread를 상속한 객체 생성


레퍼런스.setPriority(1 ~ 10);
}
}
Colored by Color Scripter
cs



       -> 2. 순환 할당 방식 (Round-Robin)
            -> 시간 할당량(Time Slice)를 정하여 하나의 스레드를 정해진 시간만큼 실행시키는 방식
            -> JVM에 의해 정해짐 (코드로 제어 불가능)


     > 스레드 컨트롤
       -> 실행중인 스레드의 상태를 제어하기 위한 것으로 효율적이고 정교한 스케쥴링을 위한 스레드 상태를 제어하는 기능이다.

 

 

메소드 설명
void interrupt() sleep() join()에 의해 일시 정지 상태인 스레드를 실행 대기 상태로 만든다. 해당 쓰레드에서는 InterruptException이 발생하게 되어 일시 정지를 벗어난다.
void join()
void join(long millis)
void join(ling millis, int nanos)
지정된 시간 동안 스레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 스레드로 다시 돌아와 실행을 계속 한다.
static void sleep(long millis)
static void sleep(long millis, int nanos)
지정된 시간 동안 스레드를 일시 정지 시킨다. 지정한 시간이 지나고 나면, 자동적으로 다시 실행 대기 상태가 된다.
static void yield() 실행 중에 다른 스레드에게 양보하고 실행 대기 상태가 된다.
void wait()
void wait(long timeout)
void wait(long timeout, int nanos)
동기화된 블록 안에서 다른 스레드가 이 객체의 notify(), notifyAll()을 호출하거나 지정된 시간이 지날 때 까지 현재의 스레드를 대기시킨다.
void notify() 동기화된 블록 안에서 호출한 객체 내부에 대기중인 스레드를 깨운다. 여러 스레드가 있을 경우 임의의 스레드 하나에만 통보한다.
void notifyAll() 동기화된 블록 안에서 호출한 객체 내부에 대기중인 모든 스레드를 깨운다. 하지만 lock는 하나의 스레드만 얻을 수 있다.

 

 

 

     > 동기화(Synchronized)

       -> 한 번에 한 개의 스레드만 프로세스 공유 자원(객체)에 접근할 수 있도록 락(Lock)을 걸어 다른 스레드가 진행중인 작업에 간섭하지 못하도록 하는 것을 말한다. 한 스레드가 진행한 뒤 다음 스레드가 실행 되는 경우 이전 스레드에서 실행하고 바뀐 상태의 객체를 이어서 실행하게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. 동기화 메소드
public synchronized void method() {
        //한 개의 스레드만 실행할 수 있음
}
 
2. 동기화 블록
public void method1() {
    // 여러 스레드 실행할 수 있음
 
    synchronized (공유객체) {
        // 한 개의 스레드만 실행할 수 있음
    }
    // 여러 스레드 실행할 수 있음
}
cs

       -> 동기화 메소드를 다른 스레드가 접근하지 못하게 잠긴다.

 

 

     > 데몬 스레드(Daemon Thread)

       -> 다른 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

       -> 데몬 스레드 이외의 스레드들이 모두 종료되면 데몬 스레드는 강제적으로 종료된다.

 

 

     > 데몬 스레드 생성

       -> 데몬 스레드가 될 스레드의 레퍼런스 변수에 setDaemon(true)를 호출하여 생성

       -> 단, start() 메소드 호출 전에 setDaemon(true)를 호출해야 한다. -> IllegalThreadStateException이 발생

 

 

     > 스레드(Thread), 동기화(Synchronized) 실습 코드와 출력 결과

 

     > chap2.sync.Buffer

 

     > chap2.sync.Consumer

 

     > chap2.sync.Producer

 

     > chap2.Application

 

 

 

     > Network_Server.thread.Receiver

 

 

 

반응형
Comments