쓰레드 (Thread) - 구현 & 실행, 멀티쓰레드

이의준·2024년 6월 13일

Java

목록 보기
72/87

프로세스와 쓰레드 (process & thread)

  • 프로세스 (공장)
    • 실행중인 프로그램
    • 자원(resource)과 쓰레드로 구성
  • 쓰레드 (일꾼)
    • 프로세스 내에서 실제 작업을 수행
    • 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있음
    • 싱글 쓰레드 프로세스
      • 자원 + 쓰레드
    • 멀티 쓰레드 프로세스
      • 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드

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

멀티쓰레드의 장단점

  • 장점
    • 시스템 자원을 보다 효율적으로 사용할 수 있음
    • 사용자에 대한 응답성이 향상됨
    • 작업이 분리되어 코드가 간결해짐
  • 단점
    • 동기화(synchronization)에 주의해야 함
    • 교착상태(dead-lock)가 발생하지 않도록 주의해야 함
    • 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 함

쓰레드의 구현과 실행

    1. Thread 클래스를 상속
    • 쓰레드를 상속받으면 다른 클래스를 상속받을수 없음 (자바의 단일상속)
    MyThread t1 = new MyThread(); // 쓰레드의 생성
    t1.start(); // 쓰레드의 실행
    1. Runnable 인터페이스를 구현 (더 추천됨)
    • Runnable 인터페이스는 run() 추상메소드 하나만 가지고 있음
      Runnable r = new MyThread2(); // Thread(Runnable r)
      // Thread t2 = new Thread(new MyThread2());
      t2.start();

쓰레드의 실행 - start()

  • 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작
ThreadEx1_1 t1 = new ThreadEx1_1();
ThreadEx1_1 t2 = new ThreadEx1_1();

t1.start()
t3.start()
  • t1과 t2중 어느 쓰레드가 먼저 실행되는지 모름
  • 쓰레드를 start하면 실행 가능한 상태가 되는 것이지 바로 실행되는 것이 아님
  • 어느 쓰레드가 먼저 실행될지는 OS의 스케줄러가 결정

main 쓰레드

  • main메서드의 코드를 수행하는 쓰레드
  • 쓰레드는 '사용자 쓰레드'와 '데몬 쓰레드' 두 종류가 있음
  • 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램이 종료됨

멀티쓰레드

public class imsi2 {
    static long startTime = 0;

    public static void main(String[] args) {
        ThreadEx11_1 th1 = new ThreadEx11_1();
        ThreadEx11_2 th2 = new ThreadEx11_2();
        th1.start();
        th2.start();
        startTime = System.currentTimeMillis();

        try {
            th1.join(); // main쓰레드가 th1의 작업이 끝날 때까지 기다린다.
            th2.join(); // main쓰레드가 th2의 작업이 끝날 때까지 기다린다.
        } catch (InterruptedException e) {}
        System.out.println();
        System.out.println("소요시간 : " + (System.currentTimeMillis() - startTime));
    }
}

class ThreadEx11_1 extends Thread {
    public void run() {
        for (int i = 0; i < 300; i++) {
            System.out.print(new String("-"));
        }
    }
}

class ThreadEx11_2 extends Thread {
    public void run() {
        for (int i = 0; i < 300; i++) {
            System.out.print(new String("|"));
        }
    }
}
  • .join() 메소드는 해당 쓰레드의 작업을 기다리도록 하는 역할 수행
  • 출력마다 소요시간과 출력 순서가 다름


0개의 댓글