2. 프로세스
• 실행 중인 프로그램
• 프로그램을 실행하면 OS로 부터 자원(메모리)을 받음
• 각 독립된 메모리 영역을 할당 받는다. (Code, Data, Stack, Heap)
Code: 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
Data: 전역변수, 정적변수, 배열 등 초기화된 데이터
Heap: 동적 할당시 사용
Stack: 지역변수, 매개변수 리턴 값 임시 메모리 영역
3. 멀티 프로세스
• 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업 처리
• 독립적이라 다른 프로세스에 영향이 가지 않음(안정적)
• 멀티 스레드보다 많은 메모리와 CPU 시간 차지
• 빈번한 Context Switching으로 성능 저하 우려
4. 쓰레드
• 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 자원들은 공유한다
• 즉, 프로세스 내에서 Stack만 할당 받고 Code, Data, Heap 영역은 공유
5. 멀티 쓰레드
• 하나의 응용 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리
• 시스템의 자원과 처리 비용 감소
• Context Switching이 빠름(Stack 영역만 처리하면 되기 때문)
• 그 외 자원(Code, Data, Heap)을 공유하여 통신 부담이 적음
• 스레드 하나 이상 생기면 다 죽어버림..
생전 고인의 마지막 모습…
6. 쓰레드를 알아야 하는 이유?
스프링 어디서든 다 쓰인다..
• Tomcat - Thread Pool
새로운 Thread 생성에는 은근 많은 비용이 든다고 한다.
클라이언트가 서버 접속 시 쓰레드를 할당받아 Servlet 로직을 탄다
7. 쓰레드를 알아야 하는 이유?
스프링 어디서든 다 쓰인다..
• Tomcat - Thread Pool
Pool에 쓰레드를 미리 만든 다음에 가용 개수까지 자유롭게 쓰고
반환해주면 된다.
8. 쓰레드를 알아야 하는 이유?
스프링 어디서든 다 쓰인다..
• Security - Thread Local
해당 쓰레드만의 전용 보관소를 만들어 준다.
Security ContextHolder에서 사용자 정보를 보관할 때 사용
9. 구현 방법
1 - Thread를 상속받음
package thread;
public class ThreadWithClass extends Thread {
@Override
public void run() {
for (int i=0; i<5; i++) {
System.out.println(getName());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
10. 구현 방법
2 - 인터페이스 구현
package thread;
public class ThreadWithRunnable implements Runnable {
@Override
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();
}
}
}
}
11. 사용
둘다 start을 실행해주면 된다!
package thread;
public class ThreadApp {
public static void main(String[] args) {
ThreadWithClass thread1 = new ThreadWithClass();
Thread thread2 = new Thread(new ThreadWithRunnable());
thread1.start();
thread2.start();
}
}