by 홍석주
Java Thread
+ Process
프로세스
• 실행 중인 프로그램

• 프로그램을 실행하면 OS로 부터 자원(메모리)을 받음

• 각 독립된 메모리 영역을 할당 받는다. (Code, Data, Stack, Heap)
Code: 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
Data: 전역변수, 정적변수, 배열 등 초기화된 데이터
Heap: 동적 할당시 사용
Stack: 지역변수, 매개변수 리턴 값 임시 메모리 영역
멀티 프로세스
• 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업 처리

• 독립적이라 다른 프로세스에 영향이 가지 않음(안정적)

• 멀티 스레드보다 많은 메모리와 CPU 시간 차지

• 빈번한 Context Switching으로 성능 저하 우려
쓰레드
• 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 자원들은 공유한다

• 즉, 프로세스 내에서 Stack만 할당 받고 Code, Data, Heap 영역은 공유
멀티 쓰레드
• 하나의 응용 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리

• 시스템의 자원과 처리 비용 감소

• Context Switching이 빠름(Stack 영역만 처리하면 되기 때문)

• 그 외 자원(Code, Data, Heap)을 공유하여 통신 부담이 적음

• 스레드 하나 이상 생기면 다 죽어버림..
생전 고인의 마지막 모습…
쓰레드를 알아야 하는 이유?
스프링 어디서든 다 쓰인다..
• Tomcat - Thread Pool
새로운 Thread 생성에는 은근 많은 비용이 든다고 한다.
클라이언트가 서버 접속 시 쓰레드를 할당받아 Servlet 로직을 탄다
쓰레드를 알아야 하는 이유?
스프링 어디서든 다 쓰인다..
• Tomcat - Thread Pool
Pool에 쓰레드를 미리 만든 다음에 가용 개수까지 자유롭게 쓰고
반환해주면 된다.
쓰레드를 알아야 하는 이유?
스프링 어디서든 다 쓰인다..
• Security - Thread Local
해당 쓰레드만의 전용 보관소를 만들어 준다.
Security ContextHolder에서 사용자 정보를 보관할 때 사용
구현 방법
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();
}
}
}
}
구현 방법
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();
}
}
}
}
사용
둘다 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();
}
}

쓰레드.pdf

  • 1.
  • 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(); } }