lala9663
Bump into
lala9663
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (1)
    • Java (39)
    • Spring (28)
    • IntelliJ (7)
    • Git,Github (2)
    • CS (22)
    • Algorithm (23)
      • Algorithm 문제 (13)
    • 공부방 (9)
    • 그 외 (27)
      • TIL (24)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • try-catch
  • Post
  • 정적
  • was
  • 동적
  • 백준
  • Get
  • thread
  • Java
  • 백준 2292
  • Til
  • Spring
  • jsp
  • 백준 벌집
  • 웹서버
  • 1193
  • Intellij
  • servlet
  • 웹 3.0
  • 자바
  • 자바 람다
  • 스트림(Stream)

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
lala9663

Bump into

Java

[Java] 쓰레드(Thread)

2022. 10. 17. 19:30

동작하고 있는 프로그램을 프로세스(Process)라고 한다. 보통 한 개의 프로세스는 한 가지의 일을 하지만, 스레드를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있다.

스레드란

어떠한 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름의 단위이다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.

멀티스레딩이란?

여러 스레드를 동시에 실행시키는 응용프로그램을 작성하는 기법이다.

장점

  1. 메모리 공유로 인한 시스템 자원 소모가 줄어든다.
  2. 동시에 두 가지 이상의 활동을 하는 것이 가능해진다.

단점

  1. 서로 자원을 소모하다가 충돌이 일어날 가능성이 존재한다.
  2. 코딩이 난해해져 버그 생성 확률이 높아진다.

Thread 생성주기

Thread 생성주기

Runnable 상태: 스레드가 실행되기 위한 준비 단계
Running 상태: 스케줄러에 의해 선택된 스레드가 실행되는 단계
Blocked 상태: 스레드가 작업을 완수하지 못하고 잠시 작업을 멈추는 단계

 

스레드의 생성과 실행

자바에서 스레드를 생성하는 방법에는 다음과 같이 두 가지 방법이 있다.

  1. Runnable 인터페이스를 구현하는 방법
  2. Thread 클래스를 상속받는 방법

두 방법 모두 스레드를 통해 작업하고 싶은 내용을 run() 메서드에 작성하면 된다.

다음 예제는 위의 두 가지 방법을 사용하여 스레드를 생성하고 실행하는 예제이다.
Try-catch문은 이전에 다뤘으니 모르겠으면 참고하도록 하자.

class ThreadWithClass extends Thread {

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(getName()); // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10);          // 0.01초간 스레드를 멈춤.

            } catch (InterruptedException e) {

                e.printStackTrace();
            }
        }
    }
}

class ThreadWithRunnable implements Runnable {

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(Thread.currentThread().getName()); // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10);

            } catch (InterruptedException e) {

                e.printStackTrace();
            }
        }
    }
}

public class Thread01 {

    public static void main(String[] args){

        ThreadWithClass thread1 = new ThreadWithClass();       // Thread 클래스를 상속받는 방법

        Thread thread2 = new Thread(new ThreadWithRunnable()); // Runnable 인터페이스를 구현하는 방법

        thread1.start(); // 스레드의 실행

        thread2.start(); // 스레드의 실행
    }
}

실행 결과

Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1

위 예제의 실행 결과를 보면, 생성된 스레드가 서로 번갈아가며 실행되고 있는 것을 알 수 있다.

Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없으므로, 일반적으로 Runnable 인터페이스를 구현하는 방법으로 스레드를 생성한다.

'Java' 카테고리의 다른 글

[Java] Stream(스트림)?  (0) 2022.10.18
[Java] 람다식?  (0) 2022.10.18
[Java] Try-catch 문이란? (예외처리)  (0) 2022.10.17
[Java] Enum  (0) 2022.10.06
[Java] equals() 와 hashCode  (0) 2022.10.06
    'Java' 카테고리의 다른 글
    • [Java] Stream(스트림)?
    • [Java] 람다식?
    • [Java] Try-catch 문이란? (예외처리)
    • [Java] Enum
    lala9663
    lala9663
    초보의 험난한 공부

    티스토리툴바