Back-End/백엔드 관련 정리

[백엔드 과정][자바 기초] - 1. 스레드(Thread)

얄루몬 2022. 9. 6. 16:24


Java의 스레드 프로그래밍

  • 스레드 생성, 실행
  • 단일 스레드
  • 멀티 스레드
  • 스레드 상채변화
  • 스레드 동시성 제어

스레드 생성,실행

java에서의 스레드 구현

  • Thread 클래스 상속
    • 자바에서 지원하는 Thread 클래스를 상속하여 구현하는 것을 말한다.
    • Thread 클래스의 경우 Runnable을 구현하여 정의했다. 
    • 한 번만 사용할거라면 따로 객체 생성 없이 사용이 바로 가능하다(상속을 했기 때문 Runnable 인터페이스 구현은 무조건 객체 생성 후 사용해야 한다.)
  • Runnable 인터페이스 구현
    • Runnable 인터페이스를 구현하는 방식도 쓰레드의 생성, 실행 방법 중 하나다.
    • Thread 클래스 역시 Runnable 인터페이스를 구현하여 정의되었다. 

Thread 클래스 상속에 의한 구현

package extendsThread;

import java.util.concurrent.ExecutionException;

public class ExtendsThread extends Thread{
    private String message;
    private int loopCount;

    public ExtendsThread(String message){
        this.message = message;
        this.loopCount = 0;
    }

    @Override
    public void run() {
        while (!Thread.interrupted()){
            try{
                ++this.loopCount;
                System.out.println(this.message +" : "+ this.loopCount);
                Thread.sleep((long)(Math.random()*1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ExtendsThread thread1 = new ExtendsThread("one");
        ExtendsThread thread2 = new ExtendsThread("two");
        ExtendsThread thread3 = new ExtendsThread("three");

        thread1.start();
        thread2.start();
        thread3.start();
    }
}
  • Thread를 상속받아 구현하였고 수행하는 동안에 주어진 메시지를 무한 출력하도록 했다.

Runnable 인터페이스 구현

package implementsThread;

public class RunnableThread implements Runnable{
    private String message;
    private int loopCount;

    public RunnableThread(String message){
        this.message= message;
        this.loopCount = 0;
    }

    @Override
    public void run() {
        while (Thread.interrupted()) {
            try {
                ++this.loopCount;
                System.out.println(message + " : " + this.loopCount);
                Thread.sleep((long)(Math.random()*1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Thread thread1 = new Thread(new RunnableThread("one"));
        Thread thread2 = new Thread(new RunnableThread("two"));
        Thread thread3 = new Thread(new RunnableThread("three"));

        thread1.start();
        thread2.start();
        thread3.start();
    }
}
  • Runnable 인터페이스를 구현하였고 Thead 객체를 통해 구현한 객체를 생성하여 사용한다.
  • 수행하는 동안에 주어진 메시지를 무한 출력하도록 했다.

Class Thread VS Interface Runnable

Thread 클래스의 상속을 통해 구현할 경우

  • 자바는 다중 상속을 지원하지 않기 때문에 다른 클래스의 상속이 불가하다.
  • 객체 생성 후 바로 실행이 가능하다.

Runnable 인터페이스의 구현을 통해 구현할 경우

  • 다른 클래스에서 상속을 통해 구현이 가능하다.
  • 객체 생성 후 바로 사용할 수 없고 추가적인 Thread 객체가 요구된다.
  • Thread thread3 = new Thread(new RunnableThread("three")); -> 추가적인 Thread 객체가 요구된 경우

단일 스레드

  • Main 스레드에서 작업을 진행하며 작업은 순차적으로 진행한다.
  • 하나의 프로세스에서 오직 하나의 스레드만 실행하는 것을 의미한다.
    • 단일 레지스터와 스택으로 구성
    • Context Switching 작업을 요하지 않는다.
    • 동시성 제어에 대한 처리를 신경쓰지 않아도 된다.

멀티 스레드

  • 프로그램 내에서 두 개 이상의 동작을 동시에 실행한다.
    • 프로세서의 활동을 극대화
    • 두개의 동작을 동시에 실행
  • 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유한다.
    • 자원의 생성과 관리의 중복성을 최소화한다.
    • 수행 능력을 향상시킨다.

스레드 상태

  • New: 스레드가 실행 준비를 완료한 상태로, start() 메소드를 호출하기 전 상태
  • Runnable: start()가 호출되어 실행될 수 있는 상태 Wait 다른 스레드가 통지할 때 까지 기다리는 상태
  • Timed_wait: 정해진 시간동안 기다리는 상태
  • Blocked: 사용하고자 하는 객체의 잠금(lock)이 풀릴 때까지 대기하는 상태
  • Terminated: 실행이 종료된 상태

스레드 상태 전이

스레드는 내부 동작에 의해 상태가 변경되거나 외부적 요처엥 의해 상태 변경이 가능하다.