참고: Thread와 Runnable에 대한 이해 및 사용법
프로그램의 실행 속도를 개선하기 위해 Thread 클래스와 Runnable 인터페이스로 여러 개 스레드를 생성할 수 있다.
Runnable 인터페이스
Java에서 스레드를 생성하기 위한 인터페이스
- run() 메서드를 반드시 구현해야 한다.
- start() 메서드가 없기 때문에 새로운 스레드 생성을 위해선 , Thread 객체에 전달해서 start()를 호출해야 한다.
class foo implements Runnable {
@Override
public void run() {
// 쓰레드에서 실행할 내용
}
}
Thread 클래스
Runnable 인터페이스를 구현한 스레드를 생성하는 클래스로, Runnable 보다 많은 기능을 제공한다.
- 새로운 스레드를 생성하기 위해 start() 호출
- 다양한 기능:
- 스레드의 상태를 변경하는 메서드 (ex) start() 스레드 시작, suspend() 스레드 일시 정지
- 스레드를 우선순위 별로 실행 순서를 제어할 수 있는 메서드
- 스레드의 실행 상태를 조사하기 위한 메서드 (ex) isAlive() 스레드가 실행 중인지 여부 확인
class foo extends Thread {
@Override
public void run() {
// 쓰레드에서 실행할 내용
}
}
주의!!
새로운 스레드를 생성할 때는 start()를 호출해야 한다. run()을 호출할 경우, 단순히 메인 스레드에서 해당 객체의 run() 메서드를 실행시키는 것이다.
start()의 동작 방식
- 스레드가 실행 가능한지 확인
- 스레드를 스레드 그룹에 추가
- JVM이 스레드를 실행시킴
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
차이점
Runnable | Thread | |
람다 | O | X |
상속 필요 | X | O |
자원 사용량 | 적다 | 많다 |
사용 예시
Thread
@Test
void threadStart() {
Thread thread = new MyThread();
thread.start();
System.out.println("Hello: " + Thread.currentThread().getName());
}
static class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread: " + Thread.currentThread().getName());
}
}
// 출력 결과
// Hello: main
// Thread: Thread-2
Runnable
@Test
void runnable() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Thread: " + Thread.currentThread().getName());
}
};
Thread thread = new Thread(runnable);
thread.start();
System.out.println("Hello: " + Thread.currentThread().getName());
}
// 출력 결과
// Hello: main
// Thread: Thread-1
Thread, Runnable의 한계점
- 쓰레드를 생성하는데 저수준 API에 의존한다. > 애플리케이션 개발과 먼 관심사
- 쓰레드 작업이 끝난 후 결과 값을 반환받는 것이 불가능
- 매번 스레드를 생성하고 종료하는 오버헤드 발생
- 스레드들의 관리가 어려움
→ 그래서 Java5에서 Executor, ExecutorService, ScheduledExecutionService, Callable, Future 등장
'CS' 카테고리의 다른 글
[CS 스터디] 운영체제(Operating System) (0) | 2023.07.13 |
---|---|
[CS 스터디] 프로세스 (Process), 스레드 (Thread) (0) | 2023.07.13 |
[CS 스터디] Blocking & Non-Blocking I/O (0) | 2023.07.10 |
[CS 스터디] Blocking, Non-blocking & Synchronous, Asynchronous (0) | 2023.07.10 |
[CS 스터디] 대칭키, 공개키(비대칭키) (0) | 2023.06.30 |