Thread에 대해 알아보자

yeolyeol·2023년 5월 29일
1

til

목록 보기
2/8
post-thumbnail

🤦‍♂️와 진짜 과제 너무한거 아님? 교수님은 우리가 멀티스레드처럼 할 수 있다고 생각하시는건가?
ㄴ ㄹㅇㅋㅋ
   ㄴ ㄹㅇㅋㅋ22


Process

스레드에 대해 알아보기 전 우리는 프로세스가 무엇인지부터 간단하게 알아보자.

프로세스(Process)

: 실행 중인 프로그램(program)
엥? 별거 없는데?

즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.

그렇다면 사용되는 데이터와 메모리는 잘 알고있지만, 드기만 해본 스레드에 알아보자.


Thread

스레드(Thread)

: 프로세스(process) 내에서 실제로 작업을 수행하는 주체

모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.

특징

  • 프로세스 내의 명령어 블록으로 시작점과 종료점을 갖는다.
  • 실행중에 멈출 수 있으며, 동시에 수행 가능.
  • 어떠한 프로그램내에서 특히 프로세스 내에서 실행되는 흐름의 단위.

스레드의 생성 및 실행

나의 주 언어는 Java이기 때문에 Java 코드로 예시를 보여주자면,

총 2가지 방법으로 스레드를 생성할 수 있다.

  1. Runnable 인터페이스를 구현
class ThreadWithRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 5; i++) {
			// 현재 실행 중인 스레드의 이름을 반환함.
            System.out.println(Thread.currentThread().getName()); 
            
            try {
                Thread.sleep(10); // 0.01초간 스레드를 멈춤.
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. Thread 클래스를 상속
class ThreadWithClass extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
			
            System.out.println(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

설명

위 코드를 보면 thread1을 먼저 실행시켰기 때문에 Thread-0이 먼저 5개 출력될 것이라고 생각할 수 있다.

하지만 스레드를 두개로 나누어 동시에 실행시켰고, 한 번 출력이 되면 다음 스레드가 진입할 수 있도록 출력한 스레드를 0.01초 지연시켰다.

그래서 출력이 Thread-0Thread-1이 번갈아 출력된다.

그렇다면, try-catch문이 없었다면 어땠을까?

직접 실행한다면 Thread 0과 1이 랜덤하게 출력될 것이다.


스레드 우선순위

자바에서 각 스레드는 우선순위(priority)에 관한 자신만의 필드를 가지고 있다.
이러한 우선순위에 따라 특정 스레드가 더 많은 시간 동안 작업을 할 수 있도록 설정할 수 있다.

필드설명
static int MAX_PRIORITY스레드가 가질 수 있는 최대 우선순위
static int MIN_PRIORITY스레드가 가질 수 있는 최소 우선순위
static int NORM_PRIORITY스레드가 생성될 때 가지는 기본 우선순위

그리고 이런 우선순위를 getPriority()setPriority()메서드를 통해 우선순위를 불러오거나 설정할 수 있다.

참고로, main() 메소드를 실행하는 스레드의 우선순위는 언제나 5이다.


마치며

스레드의 기본과 그 사용법에 대해 알아보았다.

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

아직 설명이 더 필요한 개념들이 남아있기에 이는 다음 포스팅에서 다룰 예정이다.

profile
한 걸음씩 꾸준히

0개의 댓글