🌱 오늘의 주제 : 쓰레드란?
🌱 쓰레드란?
- 프로세스란 간단히 말해서 '실행 중인 프로그램'이다. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있으며, 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다.
- 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다.
- 메신저로 채팅하면서 파일을 다운로드 받거나 음성대화를 나눌 수 있는 것이 가능한 이유가 멀티쓰레드로 작성되어 있기 때문이다.
🌱 멀티쓰레딩의 장단점
- CPU의 사용률을 향상시킨다.
- 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
🌱 쓰레드의 구현과 실행
- 1. Thread클래스를 상속받는 방법 (Thread클래스 상속받으면 다른 클래스 상속 불가하기 때문에 잘 사용 안함)
- 2. Runnable 인터페이스를 구현하는 방법 (일반적으로 많이 사용)
- 재사용이 높고, 코드의 일관성을 유지할 수 있어 객체지향적인 방법이다.
- 쓰레드를 구현하는 것은 쓰레드를 통해 작업하고자 하는 내용으로 run()의 몸통{}을 채우는 것이다.
1. Thread 클래스를 상속
class MyThread extends Thread {
public void run() { .. } // Thread클래스의 run()을 오버라이딩
}
2. Runnable 인터페이스를 구현
class MyThread implements Runnable {
public void run() { ... }. // Runnable 인터페이스의 run() 구현
}
🌱 쓰레드의 구현과 실행 예제
public class ex13_1 {
public static void main(String[] args) {
// 쓰레드의 구현과 실행
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2(); // Runnable인터페이스를 구현한 클래스의 인스턴스를 생성한 다음, Thread클래스의 생성자의 매개변수로 제공해야 한다.
Thread t2 = new Thread(r); // 생성자 Thread(Runnable target) // Thread t2 = new Thread(new ThreadEx1_2()); 두 줄을 한 줄로 간단히.
t1.start(); // 쓰레드 호출 start()
t2.start();
}
}
class ThreadEx1_1 extends Thread {
public void run() { // 쓰레드가 수행할 작업
for(int i = 0; i < 5; i++) {
System.out.println(this.getName()); // 조상인 Thread의 getName()을 호출
}
}
}
class ThreadEx1_2 implements Runnable {
public void run() { //쓰레드가 수행할 작업
for(int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}
----
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
🌱 쓰레드의 실행 - start()
- 쓰레드는 start()를 호출해야만 쓰레드가 실행된다.
ThreadEx1_1 t1 = new ThreadEx1_1();
t1.start(); // 쓰레드 호출 start()
- 호출 되어서 바로 실행되는 것이 아니고, 일단 실행대기 상태에 있다가 자신의 차례가 되어야 실행된다. 실행대기중인 쓰레드가 하나도 없으면 곧바로 실행된다.
- 하나의 쓰레드의 start()가 한번만 호출 될 수 있다.
- 한번 더 수행해야 한다면, 새로운 쓰레드를 생성한 다음에 start()를 호출해야 한다. 두번 이상 호출 시 , IllegalThreadStateException 발생.
ThreadEx1_1 t1 = new ThreadEx1_1();
t1.start();
t1 = new ThreadEx1_1(); // 다시 생성
t1.start(); // OK
🌱 start()와 run()
- main 메서드에서 run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 선언된 메서드를 호출하는 것일 뿐이다.
- 1. main메서드에서 쓰레드의 start()를 호출한다.
- 2. start()는 새로운 쓰레드를 생성하고, 쓰레드가 작업하는데 사용될 호출스택을 생성한다.
- 3. 새로 생성된 호출스택에 run()이 호출되어, 쓰레드가 독립된 공간에서 작업을 수행한다.
- 4. 이제는 호출스택이 2개이므로 스케쥴러가 정한 순서에 의해서 번갈아 가면서 실행된다.
🌱 main 쓰레드
- main 메서드의 작업을 수행하는 것도 쓰레드이다.
- 실행 중인 사용자 쓰레드가 하나도 없을때 프로그램은 종료된다.
'Java' 카테고리의 다른 글
Java - 쓰레드의 우선순위 & 데몬 쓰레드 (0) | 2023.03.21 |
---|---|
Java - 싱글쓰레드와 멀티쓰레드 & 쓰레드의 I/O 블락킹(blocking) (0) | 2023.03.20 |
Java - 에너테이션의 조상, 규칙, 활용 (0) | 2023.03.16 |
Java - 메타 애너테이션이란? (0) | 2023.03.14 |
Java - 애너테이션이란? (0) | 2023.03.13 |