🤦♂️와 진짜 과제 너무한거 아님? 교수님은 우리가 멀티스레드처럼 할 수 있다고 생각하시는건가?
ㄴ ㄹㅇㅋㅋ
ㄴ ㄹㅇㅋㅋ22
스레드
에 대해 알아보기 전 우리는 프로세스
가 무엇인지부터 간단하게 알아보자.
: 실행 중인 프로그램(program)
엥? 별거 없는데?
즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.
그렇다면 사용되는 데이터와 메모리는 잘 알고있지만, 드기만 해본 스레드에 알아보자.
: 프로세스(process) 내에서 실제로 작업을 수행하는 주체
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.
나의 주 언어는 Java이기 때문에 Java 코드로 예시를 보여주자면,
총 2가지 방법으로 스레드를 생성할 수 있다.
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();
}
}
}
}
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-0
과 Thread-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 인터페이스를 구현하는 방법으로 스레드를 생성한다.
아직 설명이 더 필요한 개념들이 남아있기에 이는 다음 포스팅에서 다룰 예정이다.