[자바(Java)] 스레드 (Thread)

방용환·2023년 4월 17일
0
post-thumbnail

1. 스레드 (Thread)

용어 설명

  • 스레드 (Thread) : 프로그램에서 명령을 실행하기 위한 최소의 작업 단위
  • 프로세스 (Process) : 메모리에 저장된 프로그램
    => 중앙처리장치에 의해 실행되기 위한 명령
    => 메모리에 저장된 프로그램
  • 단일 스레드 프로그램 : JVM에 의해 생성된 main 스레드를 이용하여 main() 메소드를 호출하여 명령 실행
    => main() 메소드가 종료되면 main 스레드는 자동 소멸 -> 프로그램 종료

2. 스레드 기초

  • 객체를 생성하여 메소드를 호출한 경우 스레드가 메소드로 이동하여 메소드의 명령 실행
  • 다중 스레드 프로그램 : 프로그램 개발자가 직접 스레드를 생성하여 다수의 명령을 동시에 실행되도록 만든 프로그램
    => 프로그램의 모든 스레드가 소멸돼야만 프로그램 종료
  • GUI 프로그램 및 Web 프로그램 등은 다중 스레드 프로그램으로 작성

3. Thread 클래스

1. Thread 클래스

  • Thread 클래스 : 스레드 관련 정보를 저장하여 스레드 관련 제어 기능을 메소드로 제공하기 위한 클래스
  • Thread 클래스로 직접 객체를 생성하여 start() 메소드 호출시 새롭게 생성된 스레드는 Thread 객체의 명령이 없는 run() 메소드 호출되어 무의미
  • 하나의 Thread 객체는 하나의 스레드만 생성 가능
    => Thread 객체를 사용하여 start() 메소드를 여러번 호출할 경우IllegalThreadStateException 예외 발생

2. Thread. 매소드

  • Thread.currentThread() : 현재 명령을 읽어 스레드에 대한 Thread 객체를 반환하는 메소드
  • Thread.getName() : Thread 객체에 저장된 스레드의 이름을 반환하는 메소드
  • Thread.start() : Thread 객체로 새로운 스레드를 생성하기 위한 메소드

4. 실행

프로그램 개발자가 스레드를 생성하여 명령을 실행하는 방법-1 : Thread 클래스 이용

  1. Thread 클래스를 상속받은 자식클래스 작성
  2. Thread 클래스를 상속받은 자식클래스에서 run() 메소드 오버라이드 선언
    => run() 메소드에는 프로그램 개발자에 의해 생성된 스레드가 실행하기 위한 명령 작성
  3. Thread 클래스를 상속받은 자식클래스로 객체 생성
    => Thread (부모클래스) 객체 생성
  4. Thread 객체로 start() 메소드 호출
    => Thread 객체를 이용하여 새로운 스레드 생성
    => 생성된 스레드는 자종으로 Thread 객체의 run() 메소드를 호출하여 run() 메소드의 명령 실행

프로그램 개발자가 스레드를 생성하여 명령을 실행하는 방법-2 : Runnable 인터페이스 이용

  • 클래스가 이미 다른 클래스를 상속받아 Thread 클래스를 상속받지 못하는 경우 Runnable 인터페이스를 상속받아 새로운 스레드를 생성하는 방법
  • 방법-1을 권장
  1. Thread 클래스를 상속받은 자식클래스 작성
  2. Thread 클래스를 상속받은 자식클래스에서 run() 메소드 오버라이드 선언
    => run() 메소드에는 프로그램 개발자에 의해 생성된 스레드가 실행하기 위한 명령 작성
  3. Thread 클래스로 Thread 객체를 생성 - Thread 클래스의 생성자 중 매개변수에 Runnable 인터페이스를 상속받은 자식클래스의 객체를 전달하여 Thread 객체를 생성하는 생성자 호출
  4. Thread 객체로 start() 메소드 호출

5. 다중 스레드 프로그램의 문제점

  • 다수의 스레드가 run() 메소드의 명령을 실행할 경우 같은 객체의 메소드를 호출하여 필드값을 변경할 경우 잘못된 처리 결과 발생 가능

    ** 해결법 : 스레드 동기화를 이용하여 스레드에 대한 메소드 호출 제어

6. 스레드 동기화 (Thread Synchronize)

1. 스레드 동기화 (Thread Synchronize)

  • 스레드 동기화 (Thread Synchronize) : 스레드에 의해 메소드 호출시 메소드의 모든 명령을 실행하기 전까지 다른 스레드로 메소드를 호출하지 못하도록 방지하는 기능
  • 다른 스레드가 이미 메소드를 호출하여 실행중인 경우 스레드를 일시 중지하여 기존 스레드의 메소드 처리가 끝난 후 일시 중지된 스레드가 실행되도록 락 (Lock) 기능 제공

2. 스레드 동기화 처리 방법

  1. synchronized 키워드를 사용하여 메소드 선언
    => 동기화 메소드 (Synchronized Method)
    => 메소드 수정이 가능할 때 사용
접근제한자 synchronized 반환형 메소드명 (자료형 매개변수, ...) {
	명령;}
  1. synchronized 키워드로 블럭을 설정하여 메소드를 호출
    => synchronized 영역의 객체로 호출되는 모든 메소드는 동기화 처리되어 실행
synchronized (객체) {
	객체.메소드명(, ...);}

0개의 댓글