멀티쓰레딩(Multi Threading)
- 하나의 프로세스 내에서 두 가지 이상의 작업(Thread)을 동시에 처리
- 실제로 두 가지 이상의 작업을 동시에 수행하는 것은 아니며,CPU가 빠른 속도로 여러작업을 번갈아가면서 수행하므로 동시에 처리되는 것처럼 느껴짐 = RR(Round Robin)방식이라고 함
- 멀티쓰레딩으로 처리되는 작업 순서는 고정이 아닌 변동이며 항상 실행결과는 달라질 수 있다! = 운영체제 스케쥴링에 따라 처리되는 순서 및 횟수가 달라지기 때문
멀티쓰레딩 구현 방법
- Thread 클래스를 상속받는 서브클래스를 정의하는 방법
- 멀티쓰레딩 코드가 포함될 서브클래승서 Thread 클래스 상속
- Thread 클래스의 run() 메서드를 오버라이딩하며 멀티쓰레딩으로 처리할 코드를 기술
- 멀티쓰레딩으로 구현된 클래스의 인스턴스 생성
- 생성된 인스턴스의 start() 메서드를 호출하여 멀티쓰레딩 시작
- Runnable 인터페이스를 구현하는 서브클래스를 정의하는 방법
- 멀티쓰레딩으로 처리할 위치의 코드에 직접 Thread를 구현하는 방법
멀티쓰레딩을 구현한 서브클래스를 Thread 클래스 상속을 통해 정의
class MyThread extends Thread {
String name;
int count;
public MyThread(String name, int count) {
super();
this.name = name;
this.count = count;
}
Thread 클래스의 run() 메서드를 오버라이딩하며 멀티쓰레딩으로 처리할 코드를 기술
@Override
public void run() {
for(int i=1;i<=count;i++) {
System.out.println(name+": "+i);
}
super.run();
}
}
멀티쓰레딩 클래스 인스턴스 생성
MyThread mt1 = new MyThread("★A작업★", 1000000);
MyThread mt2 = new MyThread("◎B작업◎", 500000);
MyThread mt3 = new MyThread("♤C작업♤", 1000000);
// Thread t = new MyThread("♤C작업♤", 1000000); //업캐스팅을 통해서도 가능
멀티쓰레딩 코드 실행(쓰레드 시작)
=> run() 메서드를 직접 호출 시 싱글쓰레딩으로 처리되므로 주의!
mt1.run();
mt2.run();
mt3.run();
// 반드시 run() 메서드가 아닌 start() 메서드를 호출해야한다!
mt1.start();
mt2.start();
mt3.start();
start() 메서드 실행 시 동작
- main() 메서드에서 쓰레드의 start() 메서드를 호출
- start() 메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출 스택(Call Stack)을 생성
- 생성된 호출 스택에 run() 메서드를 호출해서 쓰레드가 작업을 수행하도록 함
- 호출 스택이 3개이기 때문에 스케쥴러가 정한 순서에 의해서 번갈아 가면서 수행
'JAVA' 카테고리의 다른 글
[JAVA] 싱글쓰레드와 멀티쓰레드 예제 (0) | 2023.11.28 |
---|---|
[JAVA] 싱글쓰레드로 동작하는 프로그램 (0) | 2023.11.28 |
[JAVA]쓰레드 개념 익히기 (1) | 2023.11.28 |
[JAVA] 람다식 응용 (0) | 2023.11.15 |
[JAVA] 함수형 인터페이스(functional interface) 또는 타겟타입(target type) (0) | 2023.11.15 |