[Java] 멀티스레드
programming/java

[Java] 멀티스레드

16. 멀티스레드

 

16.1 프로세스(Process)와 스레드(Thread)

16.1.1 작업관리자에서 프로세스와 스레드 확인

 

[Ctrl + Alt + Delete] - [작업 관리자] - [성능] 탭에서 스레드를 확인

 

16.1.2 프로세스(Process)와 스레드(Thread)

프로세스(Process): 실행중인 프로그램

스레드(Thread): 프로세스 내에서의 작업 단위

 

 

16.1.3 프로세스의 메모리 구조

 

 

16.2 Single Thread와 Multi Thread

 

하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 Thread를 생성하는 것이 더 적은 비용이 든다.

 

 

16.3 Multi Thread를 사용해야 하는 경우

16.3.1 GUI 프로그래밍

GUI 프로그래밍에서는 main Thread에서만 UI를 그리거나 갱신할 수 있음

 

16.3.2 시간이 오래 걸리는 작업

시간이 오래 걸리는 작업의 경우 ANR(Application Not Responding) 현상을 방지하기 위해 백그라운드에서 실행되는 별도의 Thread가 필요함

그렇지 않으면 화면을 갱신하고자 하는 모든 코드는 block 당하여 ANR이 발생하게 됨

대용량 다운로드 등의 시간이 오래 걸리는 작업들

그래픽 처리, 게임 프로그래밍 등

 

 

16.4 Multi Thread의 장단점

16.4.1 장점

  • 자원을 보다 효율적으로 사용할 수 있다.
  • 사용자에 대한 응답성(responseness)이 향상된다.
  • 작업이 분리되어 코드가 간결해 진다.

 

16.4.2 단점

  • 동기화(synchronization)에 주의해야 한다.
  • 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.
  • 각 Thread가 효율적으로 고르게 실행될 수 있게 해야 한다.

 

"프로그래밍할 때 고려해야 할 사항들이 많다."

 

 

16.5 쓰레드의 구현과 실행

/** 1. Thread 클래스를 상속 */
class MyThread extends Thread {
    // Thread 클래스의 run()을 오버라이딩
    public void run() {
    	// 작업내용
    }
}

/** 2. Runnable 인터페이스를 구현 */
class MyThread implements Runnable {
    // Runnable 인터페이스의 추상메서드 run()을 구현
    public void run() {
    	// 작업내용
    }
}

 

public interface Runnable {
    public abstract void run();
}

 

 

16.6 Thread의 우선순위

16.6.1 우선순위의 설정

setPriority(숫자)

NORM_PRIORITY(5) - 기본값

MIN_PRIORITY(1)

MIN_PRIORITY(10)

 

16.6.2 우선순위가 높은 Thread에 CPU 실행시간을 더 할애함

16.6.3 우선순위가 높은 Thread가 일반적으로 더 빨리 실행됨

버스전용차선이 일반적으로 빠르지만 항상 빠르지는 않음

 

void setPriority(int newPriority);	// 스레드의 우선순위를 지정한 값으로 변경한다.
int getPriority();			// 스레드의 우선순위를 반환한다.

public static final int MAX_PRIORITY = 10;	// 최대우선순위
public static final int MAX_PRIORITY = 1;	// 최소우선순위
public static final int NORM_PRIORITY = 5;	// 보통우선순위

 

 

15.7 Thread의 동기화 - synchronized

한 번에 하나의 쓰레드만 객체에 접근할 수 있도록 객체에 락(lock)을 걸어서 데이터의 일관성을 유지하는 것

/**
 * 1. 특정한 개체에 lock을 걸고자 할 때
 */
synchronized(객체의 참조변수) {
    // (...)
}

/**
 * 2. 메서드에 lock을 걸고자할 때
 */
public synchronized void CalcSum() {
    // (...)
}