_DoYun
_yunilog
_DoYun
전체 방문자
오늘
어제
  • 전체 (83)
    • spring boot main 프로젝트 해결 (2)
    • 회고 (0)
      • pre-project(stackoverflow) (0)
    • 지식창고 (25)
    • 후기 (1)
    • LINUX (2)
    • HTML&CSS (2)
    • SQL (2)
    • 기술 면접 질문지 (1)
      • Chapter1 (1)
      • Chapter2 (0)
    • JAVA (25)
      • JAVA 기초 문법 (1)
      • Collection (1)
      • Enum,Annotation,Stream,람다 (3)
      • 입출력, Thread, JVM (1)
      • Spring Framework (3)
      • Spring MVC (6)
      • JPA (1)
      • Test (3)
      • API 문서 (1)
      • 인증&보안 (2)
      • AWS (2)
    • 알고리즘 (19)
      • 프로그래머스_LEVEL_3 (6)
      • 백준 (0)
      • 프로그래머스_LEVEL_2 (13)
    • Comento (2)
    • Inflearn (2)
      • HTTP (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
_DoYun

_yunilog

JAVA/입출력, Thread, JVM

스레드(Thread)의 기본을 배워보자

2022. 5. 21. 03:28

스레드 설명에 앞서 프로세스를 먼저 이해해야 합니다. 프로세스는 즉 실행중인 프로그램으로 프로그램이 메모리에 적재되어 운영체제에 제어를 받는 상태를 의미합니다. 예를 들어 메모장을 켠다면 그것은 하나의 프로세스를 실행시키는 것을 의미합니다. 

 

우리는 메모장으로 문서 작업을 하면서 Chrome을 통해 노래를 동시에 들을 수 있습니다. 이처럼 두가지 이상의 프로세스를 동시에 처리하는 것을 멀티태스킹(Multi-tasking)이라고 합니다.

 

다수의 애플리케이션을 동시에 실행하는 것만이 멀티태스킹이 아닙니다. 하나의 애플리 케이션 내에서도 동시에 수행할 수 있는 다수의 코드 블록이 있을 수 있습니다. 예를들어 메신저에서는 채팅을 위한 코드블록과 파일을 전송하는 코드 블록이 동시에 실행할 수 있습니다. 우리는 이것을 멀티스레딩(Multi-threading)이라고 부릅니다.

 

# 스레드(Thread)

스레드(Thread)는 사전적 의미로 한 가닥의 실입니다. 작업을 실행하는 코드의 흐름이 바느질할 떄의 실처럼 이어진 것과 같기 때문입니다. 스레드는 하나의 실행 흐름으로 프로세스 내부에 존재합니다. 프로세스는 하나 이상의 실행 흐름을 포함하기 때문에 적어도 한 개 이상의 스레드를 가지게 됩니다. 

 

스레드는 모든 파일과 메모리 등의 자원을 프로세스와 공유합니다. 따라서 공유 자원에 문제가 발생하면 스레드 전체에 영향을 미치게 됩니다. 

 

모든 자바 애플리케이션은 적어도 메인 스레드(Main Thread)라는 하나의 스레드를 가집니다. 이 하나의 애플리케이션을 다수의 스레드로 실행하려면 메인 스레드 외에 다른 스레드(작업 스레드)를 별도 생성해야 합니다. 자바는 Thread 클래스를 이용해 스레드 객체를 생성해야 하지만, 스레드가 수행할 작업 코드는 다음 두 가지 방식으로 작성할 수 있습니다.

  • Runnalbe 인터페이스 구현
  • Thread 클래스의 run() 메서드를 오버라이딩

Runnable 인터페이스와 Thread 클래스는 java.lang 패키지에 포함되어 있기 떄문에 별도의 import 문이 필요없다. 

 

//Runnable 구현 클래스 정의

class RunnableClass implements Runnable{
    //스레드가 실행할 코드
}
//Thread 객체 생성

Thread thread = new Thread(new RunnableClass());

//Thread 자식 클래스 정의

class WorkerThread extends Thread{
    //스레드가 실행할 코드
}
//Thread 자식 객체 생성

Thread thread = new WorkerThread();

그리고 두가지 방법 모두 마지막 스레드 실행을 위한 .start()메서드 추가

thread.start();

 

* 스레드 풀

 

스레드의 개수가 많아지면 그에 따른 CPU와 메모리에 많은 부하가 발생합니다. 따라서 동시에 실행하는 스레드 개수를 제한할 필요가 있습니다. 

 

스레드 풀은 제한된 개수의 스레드를 JVM에 관리하도록 맡기는 방식으로, 개발자가 스레드를 생성할 필요가 업습니다. 실행할 작업을 스레드 풀로 전달하면 JVM이 스레드 풀의 유휴 스레드 중 하나를 선택하여 실행시킵니다. 

 

[예시]

public class ThreadPool {

    public static void main(String[] args) {
        Runnable task=()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("잘가");

                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){

                }
            }
        };
		
        //스레드 풀에 있는 스레드를 사용해 실행
        Executor exec = Executors.newCachedThreadPool();
        exec.execute(task);
    }
}

 

* 스레드 상태

 

스레드 생명 주기의 대부분은 운영체제와 JVM이 통제합니다. 그러나 Thread 클래스가 제공하는 다음 메서드들을 이용하면 미디어 재생기로 동영상을 보다가 중지하거나 종료하는 등 스레드 상태를 제어할 수 있습니다. 

 

스레드의 상태와 상수

메서드 설명
interrupt 실행 중인 스레드에 인터럽트를 걸어 중지시킴
notify(), notifyAll() wait() 메서드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만듭니다.
sleep(long millis)  주어진 시간 동안 중지합니다.
join()  주어진 시간이 지나거나 대응하는 스레드가 종료될 때까지 대기시킵니다.
wait() / wait(long milis) / wait(long millis, int nanos) 동기화(synchronized) 블록 내에서 스레드를 일시 정지 상태로 만듭니다. 매개값으로 주어진 시간이 지나면 자동적으로 실행 대기 상태가 됩니다. 시간이 주어지지 않으면 notify(), notifyAll() 메서드에 의해 실행 대기 상태로 갈 수 있습니다.
yield 우선순위가 동일한 스레드에 실행을 양보합니다.
    _DoYun
    _DoYun

    티스토리툴바