[Java] Multil Thread(멀티스레드)
programming/java

[Java] Multil Thread(멀티스레드)


1. 프로세스(Process)와 스레드(Thread)


'''스레드의 뜻은 거미줄, 실타래라는 뜻이다. 스레드라는 건 작업 단위를 말한다.


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

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




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


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

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




16.1.3 프로세스의 메모리 구조




'''프로그램을 돌리게 되면 그 안에 변수나 메서드 등의 코드가 코드 영역에 올라가고, static variables가 데이터 영역에 들어간다.


2. Single Thread와 Multi Thread



"하나의 새로운 프로세스를 생성하는 것보다

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



3. Multi Thread를 사용해야 하는 경우


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


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


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

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

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


4. Multi Thread의 장단점


4.1 장점

- 자원을 보다 효율적으로 사용할 수 있다.

- 사용자에 대한 응답성(responseness)이 향상된다.

- 작업이 분리되어 코드가 간결해 진다.


16.4.2 단점

- 동기화(synchronization)에 주의해야 한다.

- 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.

- 각 Thread가 효율적으로 고르게 실행될 수 있게 해야 한다.

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


5. 쓰레드의 구현과 실행


1. Thread 클래스를 상속

class MyThread extends Thread {

public void run() { /* 작업내용 */ }    // Thread 클래스의 run()을 오버라이딩

}


2. Runnable 인터페이스를 구현

class MyThread implements Runnable {

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

}


public interface Runnable() {

public abstract void run();

}


ThreadEx1_1 t1 = new ThreadEx1_1();

 

Runnable r = new ThreadEx1_2();

Thread t2 = new Thread(r);            // 생성자 Thread(Runnable target)

// Thread t2 = new Thread(new ThreadEx1_2());


6. Thread의 우선순위


6.1 우선순위의 설정

setPriority(숫자)

NORM_PRIORITY(5) - 기본값

MIN_PRIORITY(1)

MAX_PRIORITY(10)


'''ex. printout 하는 상황


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


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

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


▶ 우선순위가 같은 경우

(graph)

▶ A의 우선순위가 높은 경우

(graph)


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

int getPriority();                                        // 스레드의 우선순위를 반환한다.

                  

public static final int MAX_PRIORITY = 10;      // 최대우선순위

public static final int MIN_PRIORITY = 1;        // 최소우선순위

public static final int NORM_PRIORITY = 5;     // 보통우선순위


7. Thread의 동기화 - synchronized


image 25 25


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


1. 특정한 개체에 lock을 걸고자 할 때

synchronized(객체의 참조변수) {

          // ...

}


2. 메서드에 lock을 걸고자할 때

public synchronized void CalcSum() {

          // ...

}


public synchronized void withdraw(int money) {

if (balance >= money) {

try {

Thread.sleep(1000);

} catch(Exception e) {


}

balance -= money;

}

}

 

public void withdraw(int money) {

synchronized(this) {

if (balance >= money) {

try {

Thread.sleep(1000);

} catch(Exception e) {


}

balance -= money;

}

}        // end of synchronized(this)

}


8. 실습예제


먼저 Single Thread와 Multi Thread가 어떤 점이 다른지 살펴봅시다.

8.1 SingleThread.java    12:26;37

8.2 ThreadExam.java


'''note.

super. : 부모클래스의 멤버

super() : 부모클래스의 생성자


this. : 현재클래스의 멤버

this() : 현재클래스의 생성자


override : 부모클래스의 method를 자식클래스에서 재정의

overload : 같은클래스에서 method 이름이 중복


'''try ~ catch block을 comment 하고 비교해보자!


3) 41;27

5) ExternThread.java    52;00


58.45 ->