728x90

멀티스레드

  • 멀티 프로세스 : 독립적 (할당받은 메모리를 통해 실행)
  • 멀티 스레드 : 독립적 x (하나의 프로세스 내부에 생성)

메인 스레드

  • 반드시 존재
  • main() 메소드를 실행하면서 시작
  • 싱글 스레드에서는 메인 스레드 종료시 프로세스 종료
  • 멀티 스레드는 작업 스레드가 계속 실행 중이면 프로세스 종료 x

작업 스레드 생성

    • Thread 클래스로부터 직접 생성
      • Runnable : 작업 스레드가 실행하는 코드를 갖고 있는 객체
      • Runnable : 인터페이스 타입 → 구현 객체를 직접 만들어야함
        • Runnable ⊃ run() → 재정의
      • Runnable은 작업 내용을 가지고 있는 객체. (실제 스레드는 아님)
    • Runnable 인터페이스
class subThread implements Runnable { public void run() { /* 소스코드 실행 내용 */ } }

방법 1. Runnable 클래스 정의

import java.awt.Toolkit;

public class BeepTask implements Runnable{
    public void run(){
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for (int i=0; i<5; i++){
            toolkit.beep();
            try {
                Thread.sleep(500);
            }
            catch (Exception err){}
        }
    }
}
Runnable beepTask = new BeepTask();
        Thread thread = new Thread(beepTask);
  1. Runnable 클래스를 정의
  2. 메인 스레드에서 Runnable 객체를 생성
  3. 메인 스레드에서 Thread 객체를 생성
  4. Thread 객체를 시작

방법 2. 익명 객체 이용

  • 메인 스레드 내부에서 Runnable 객체 정의 → Runnable 객체 생성 → Thread 객체 생성
  • 모두를 하는 방법
Thread thread = new Thread(new Runnable() {
   @Override
   public void run() {
      Toolkit toolkit = Toolkit.getDefaultToolkit();
      for(int i=0; i<5; i++) {
         toolkit.beep();
         try { Thread.sleep(500); } catch(Exception e) {}
      }
   }
});
  1. Thread 객체 생성
    1. 파라미터로 Runnable 객체 생성
      1. Runnable 객체 내부에 run() 메소드 오버라이딩하여 작성
  2. Thread 객체 시작

방법 3. 람다식 이용

  • Runnable 객체 생성을 run() 메소드 정의 하나로 통합하는 방법
Thread thread = new Thread(() -> {
            Toolkit toolkit = Toolkit.getDefaultToolkit();    
            for(int i=0; i<5; i++) {        
                toolkit.beep();
                try { Thread.sleep(500); } catch(Exception e) {}
            }
        });

방법 4. Thread 클래스 상속

  • Thread 클래스 상속 받아서 run() 메소드 오버라이딩
import java.awt.*;

public class BeepThread extends Thread {
    public void run() {
        Toolkit tookit = Toolkit.getDefaultToolkit();
        for (int i = 0; i < 5; i++) {
            tookit.beep();
            try {Thread.sleep(500);}
            catch (Exception err) {}
        }
    }
}
Thread thread = new BeepThread();

방법 5. Thread 객체 자체를 재정의

Thread thread = new Thread() {
            @Override
            public void run() {        
                Toolkit toolkit = Toolkit.getDefaultToolkit();    
                for(int i=0; i<5; i++) {        
                    toolkit.beep();
                    try { Thread.sleep(500); } catch(Exception e) {}
                }
            }
        };

스레드 이름

    • 디버깅 과정에서 각 스레드가 하는 작업 조사에 용이
    • 자동적으로 Thread-n 으로 설정
    • 스레드 이름 설정
      thread.setName("스레드 이름");​
    • 스레드 이름 알기
      thread.getName();​
    • 현재 스레드 참조 획득
      Thread thread = Thread.currentThread();​

스레드 우선순위

  • 동시성, 병렬성, 스레드 스케줄링
  • 병렬성 : 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
  • 동시성 : 개별 스레드를 동시에 실행하는 성질

  • 우선 순위, 순환 할당
  • 우선 순위 : 우선 순위가 높은 스레드가 실행 상태를 더 많이 가져감
  • 순환 할당 : 정해진 time slice만큼 실행 후 다른 스레드 실행
  • 우선 순위 방식
    • 우선 순위를 부여하지 않으면 기본적으로 5 의 우선 순위 할당
      thread.setPriority(우선순위);
      
      thread.setPriority(Thread.MAX_PRIORITY); // 10
      thread.setPriority(Thread.MIN_PRIORITY); // 1
      thread.setPriority(Thread.NORM_PRIORITY); // 5

동기화 메소드, 동기화 블록

  • 임계 영역(critical section) : 단 하나의 스레드만 실행할 수 있는 코드 영역
    • 동기화 메소드
      public synchronized void method() {
      	/* 임계 영역 */
      }​
    • 동기화 블록
      public void method() {
      	...
      	synchronized() {
      	 /* 임계 영역 */
      	}
      	...
      }​
    • 스레드가 동기화 메소드 실행 시 잠금 발생 → 실행 종료 시, 잠금 해제

스레드 상태

  • 객체 생성
    • NEW
  • 실행 대기
    • RUNNABLE
  • 일시 정지
    • WAITING
    • TIMED_WAITING
    • BLOCKED
  • 종료
    • TERMINATED


728x90

'🧑‍💻 Language > Java' 카테고리의 다른 글

[Java] Basic Java (2)  (0) 2022.04.04
[Java] Basic Java (1)  (0) 2022.03.29
[Java] 14. 스윙  (0) 2021.06.05
[Java] 13. GUI  (0) 2021.06.01
[Java] 12. 모듈화와 패키지 응용  (2) 2021.06.01