코락 CoRock
코딩하는 락스타
코락 CoRock
  • 분류 전체보기 (394)
    • frameworks (19)
      • spring (19)
      • spring-boot (0)
      • testing (0)
    • languages (94)
      • java (39)
      • kotlin (0)
      • python (42)
      • r (13)
    • libraries (0)
    • programming (239)
      • android (13)
      • c (17)
      • cpp (22)
      • database (18)
      • design-pattern (4)
      • data-structures (11)
      • git (8)
      • hadoop (6)
      • html-css (7)
      • issue (4)
      • javascript (26)
      • jsp (34)
      • os (29)
      • php (6)
      • preferences (19)
      • etc (15)
    • discography (37)
      • k-pop (18)
      • pop (19)
    • blog (4)

블로그 메뉴

  • Programming
  • Java
  • JavaScript
  • Discography
  • K-Pop Songs
  • Pop Songs
  • Blog
  • Guestbook

공지사항

인기 글

태그

  • python
  • jsp
  • r
  • 자바스크립트
  • Android
  • javascript
  • CentOS
  • 파이썬
  • Spring
  • linux
  • oracle
  • Java

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
코락 CoRock

코딩하는 락스타

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

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

2018. 10. 2. 11:05
반응형

1. 프로세스(process)와 스레드(thread)

스레드는 거미줄, 실타래라는 의미를 가지고 있습니다.

 

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

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

 

1.1.2 프로세스(process)와 스레드(thread)

  • 프로세스(process): 실행 중인 프로그램
  • 스레드(thread): 프로세스 내 작업 단위

 

1.1.3 프로세스의 메모리 구조

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

 

2. 싱글 스레드(Single Thread)와 멀티 스레드(Multi Thread)

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

 

3. 멀티 스레드를 사용해야 하는 경우

3.1 GUI 프로그래밍

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

3.2 시간이 오래 걸리는 작업

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

3.3 3.2 에서 멀티 스레드를 사용하지 않으면?

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

 

4. 멀티 스레드의 장단점

4.1 장점

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

4.2 단점

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

 

5. 스레드의 구현과 실행

5.1 Thread 클래스를 상속

public class MyThread extends Thread {

    // Thread 클래스의 run() 메서드를 오버라이딩
    public void run() {
        // (...)
    }

}

5.2 Runnable 인터페이스를 구현

public class MyThread implements Runnable {

    // Runnable 인터페이스의 run() 추상 메서드를 구현
    public void run() {
        // (...)
    } 

}
@FunctionalInterface
public interface Runnable {

    public abstract void run();

}
public class MyThreadShell {

    public static void main(String[] args) {
        ThreadEx1_1 t1 = new ThreadEx1_1();
        Runnable r = new ThreadEx1_2();

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

}

 

6. 스레드의 우선순위

6.1 우선순위의 설정

  • Thread#setPriority(int requestedPriority)
  • NORM_PRIORITY: 5 (default)
  • MIN_PRIORITY: 1
  • MAX_PRIORITY: 10

e.g. 출력하는 상황

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

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

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

 

6.3.1 우선순위가 같은 경우

(graph)

6.3.2 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. 스레드의 동기화 - synchronized

(image)

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

 

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

synchronized(객체의 참조변수) {

    // (...)

}

 

7.2 메서드에 lock 을 걸고자 할 때

public synchronized void calculateSum() {

    // (...)

}
    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;
            }
        }
    }

 

8. 실습 예제

먼저 싱글 스레드와 멀티 스레드가 어떤 점이 다른지 살펴봅시다.

 

8.1 SingleThread.java

8.2 ThreadExam.java

 

cf.

  • super.: 부모 클래스의 멤버
  • super(): 부모 클래스의 생성자
  • this.: 현재 클래스의 멤버
  • this(): 현재 클래스의 생성자
  • @override: 부모 클래스의 메서드를 자식 클래스에서 재정의
  • overloading: 같은 클래스에서 메서드 이름이 중복

8.5 ExternThread.java

 

반응형
저작자표시 비영리 변경금지
    'languages/java' 카테고리의 다른 글
    • [Java] 그래픽 처리
    • [Java] 입출력
    • [Java] 유용한 클래스들
    • [Java] 내부 클래스
    코락 CoRock
    코락 CoRock
    A COder dreaming of being a ROCKstar

    티스토리툴바