동작하고 있는 프로그램을 프로세스(Process)라고 한다. 보통 한 개의 프로세스는 한 가지의 일을 하지만, 스레드를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있다.
스레드란
어떠한 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름의 단위이다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.
멀티스레딩이란?
여러 스레드를 동시에 실행시키는 응용프로그램을 작성하는 기법이다.
장점
- 메모리 공유로 인한 시스템 자원 소모가 줄어든다.
- 동시에 두 가지 이상의 활동을 하는 것이 가능해진다.
단점
- 서로 자원을 소모하다가 충돌이 일어날 가능성이 존재한다.
- 코딩이 난해해져 버그 생성 확률이 높아진다.
Thread 생성주기
Runnable 상태: 스레드가 실행되기 위한 준비 단계
Running 상태: 스케줄러에 의해 선택된 스레드가 실행되는 단계
Blocked 상태: 스레드가 작업을 완수하지 못하고 잠시 작업을 멈추는 단계
스레드의 생성과 실행
자바에서 스레드를 생성하는 방법에는 다음과 같이 두 가지 방법이 있다.
- Runnable 인터페이스를 구현하는 방법
- 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 |