"이것이 자바다" 정리 12장 멀티 스레드

2023. 3. 10. 16:54자바/이론 공부

이 게시글은 내가 "이것이 자바다" 책을 읽고 노트에 정리해놨던 내용들을 검색하기 쉽게 데이터로 백업하는 용도의 글이다.

 

문제가 된다면 삭제하겠음.

 

 

 

12장 멀티 스레드

 

 

 

*프로세스 : 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는데 이를 프로세스라고 한다.

 

 

*멀티 태스킹 : 두가지 이상의 작업을 동시에 처리하는 것

 - CPU 및 메모리 자원을 프로세스마다 적절히 할당. 병렬로 실행.

 - 멀티태스킹과 멀티프로세스는 다름.

 

 

*멀티 스레드 : 하나의 프로세스가 두가지 이상의 작업을 처리

 - 대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할해서 병렬로 처리하는 곳에서 사용 / 네트워크 통신을 하기위해 사용 / 다수 클라이언트의 요청을 처리하는 서버를 개발할때 사용 등

 - 애플리케이션에서 실행중인 스레드가 하나라도 있다면 프로세스 종료 안됨.

 

 

*자바에서는 작업스레드도 객체로 생성함.

 

 

*Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 Runnable을 매개값으로 갖는 생성자를 호출해야한다.

 - Runnable은 작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체다.

 - 인터페이스타입이라 구현 객체를 만들어 run() 메소드를 오버라이딩해서 작업 스레드가 실행할 코드를 작성해야 함.

 

//방법1
Runnable task=new Task();
Thread thread= new Thread(task);

//방법2 (익명객체 생성)
Thread thread=new Thread(new Runnable(){
    public void run() {
    //코드
    }
});

//방법3 (람다식)
Thread thread=new Thread(() -> {
    //코드
} );


//thread 실행
thread.start();

 

 

*Runnable을 사용하지 않고 Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수 있다.

 - Thread를 상속한 후 run메소드를 오버라이딩해서 스레드가 실행할 코드를 작성하면 된다.

 

//작업1 (클래스 만들기)
public class Work extends Thread{
    @Override
    public void run() {
    	//코드
    }
}

Thread thread=new Work();


//작업2 (익명 객체)
Thread thread= new Thread() {
    public void run() {
        //코드
    }
}


//실행
thread.start();

 

 

 

*스레드의 이름

 - 스레드의 이름이 큰 역할을 하지는 않음.

 - 디버깅할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 가끔 사용.

 - 기본적으로 "Thread-n" 방식으로 이름이 주어짐. 변경하고 싶다면 setName() 메소드를 사용하면 됨.

 

 

*멀티 스레드는 동시성 또는 병렬성으로 실행됨.

 - 동시성 : 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질. (왔다갔다 하나씩 실행)

 - 병렬성 : 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질. (아예 동시에 실행)

 - 싱글 코어 CPU를 이용한 멀티 스레드 작업은 동시성 작업이다.

 

 

*스레드 스케줄링

 - 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정하는 것

 - 우선수위(Priority) 방식과 순환 할당(Round-Robin) 방식을 사용함.

 

 - 우선순위 방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링하는 것

 - 순환 할당 방식 : 시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식

 - 우선순위 방식은 개발자가 코드로 제어 가능. but 순환 할당 방식은 코드로 제어 불가능.

 

 

*동기화 메소드와 동기화 블록

 - 스레드들이 객체를 공유해서 작업할 경우, 스레드 A를 사용하던 객체가 스레드 B에 의해 상태가 변경될 수 있다. 이를 방지하기 위해 사용하는 것이 동기화 메소드와 동기화 블록이다.

 - 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 한다.

 - synchronized 키워드를 붙여 사용한다.

 

 

*임계 영역

 - 단 하나의 스레드만 실행할 수 있는 코드 영역

 - 자바에서는 임계 영역을 지정하기 위해 동기화 메소드와 동기화 블록을 제공한다.

 

 

//동기화 메소드
public synchronized void method() {
    임계영역;
}

//동기화 블록
public void method() {
    //코드
    synchronized(공유 객체) {
        임계영역;
    }
    //코드
}