1. 쓰레드와 멀티쓰레드
프로세스를 실행 중인 프로그램이라고 하면, 프로그램은 OS로 부터 실행에 필요한 메모리를 할당받아 프로세스가 됩니다.
프로세스의 메모리를 이용해서 실제로 작업을 수행하는 것이 쓰레드 입니다.
둘 이상의 쓰레드를 가진 프로세스가 멀티 쓰레드 프로세스 입니다.
2. 멀티쓰레드 장단점
장점
1. CPU 사용률 향상
2. 효율적인 메모리 사용
3. 사용자에 대한 응답성 향상
4. 작업이 분리되어 코드 간결
단점
1. 동기화와 교착 상태 문제
3. 쓰레드 구현
쓰레드를 구현하는 방법은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법이 있습니다.
public class MyThread extends Thread{
@Override
public void run() {
for(int i=0; i<3; i++){
System.out.println("MyThread : "+i+", "+getName());
}
}
}
public class OtherThread implements Runnable{
@Override
public void run() {
for(int i=0; i<3; i++){
System.out.println("OtherThread :"+i+", "+Thread.currentThread().getName());
}
}
}
public class Process1 {
public static void main(String[] args) {
MyThread t1 = new MyThread();
Runnable runn = new OtherThread();
Thread t = new Thread(runn);// 생성자 Thread(Runnable target)이 존재
// 실행대기 상태에 있다가 자신의 차례 시 실행
t1.start();
t.start();
}
}
MyThread : 0, Thread-0
MyThread : 1, Thread-0
OtherThread :0, Thread-1
OtherThread :1, Thread-1
OtherThread :2, Thread-1
MyThread : 2, Thread-0
MyThread : 0, Thread-0
MyThread : 1, Thread-0
OtherThread :0, Thread-1
MyThread : 2, Thread-0
OtherThread :1, Thread-1
OtherThread :2, Thread-1
Thread Class를 상속 받은 것은 자손 클래스의 인스턴스를 생성하여 바로 생성 => 직접 호출 사용
Runnble Interface를 통해 구현한 것은 Runnable 인스턴스를 생성하고, Thread 클래스의 생성자에 매개변수로 구현 참조하여 사용합니다. => Thread 생성자에 넘겨주어 사용
start() 와 run() 의 차이
start는 새로운 쓰레드가 작업을 실행하는데 필요한 호출 스택(call stack)을 생성한 다음에 run()을 호출해서 생성된 호출 스택에 run()이 첫 번째로 올라가게 한다.
모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출 스택을 필요로 하기 때문에, 새로운 쓰레드를 생성하고 실행시킬 때마다 새로운 호출 스택이 생성되고, 스레드가 종료되면 작업에 사용된 호출 스택은 소멸한다.
1. main->start 호출
2. 새로운 쓰레드와 안에 start 생성(호출스택 생성)
3. 호출 스택에 run 호출
4. 호출 스택 2개 구성이므로 스케줄러가 순서에 의해 수행
참고
'OOP > Java' 카테고리의 다른 글
Overloading) 오버로딩 시 생성자 에러(Constructor Class is already defined in Class) (0) | 2024.04.22 |
---|---|
Java의 Excepton클래스 종류 및 구조 (0) | 2024.04.17 |
Java 정규 표현식(Regular Expression) (0) | 2023.11.27 |
Optional이란? (0) | 2023.11.24 |
Java JUnit vs Spring JUnit (0) | 2022.12.20 |