프로세스와 쓰레드(process & thread)
-> 프로세스 : 실행중인 프로그램, 자원(메모리, CPU)과 쓰레드로 구성
-> 쓰레드 : 프로세스 내에서 실제 작업을 수행.
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
-> 프로세스 : 쓰레드 = 공장 : 일꾼
-> 싱글 쓰레드 프로세스 = 자원(공장) + 쓰레드(일꾼)
일꾼이 한명
-> 멀티 쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드
일꾼이 여러명
- "하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다"
- 2프로세스 1 쓰레드 vs. 1프로세스 2 쓰레드
- 공장을 하나 더 짓는 것보다 일꾼을 늘리는 방안이 더 효율적이다.
멀티쓰레드의 장단점
- 대부분의 프로그램이 멀티쓰레드로 작성되어 있다.
- 그러나 멀티쓰레드 프로그래밍이 장점만 있는 것이 아니다.
장점 | - 시스템 자원을 보다 효율적으로 사용할 수 있다. - 사용자에 대한 응답성(responseness)이 향상된다. - 작업이 분리되어 코드가 간결해진다. |
단점 | - 동기화(synchronization)에 주의해야 한다. - 교착상태(dead-lck)가 발생하지 않도록 주의해야 한다. - 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다. - "프로그래밍할 때 고려해야 할 사항들이 많다." |
쓰레드 구현
1. Thread 클래스를 상속
2. Runnable 인터페이스를 구현
- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.
- start()했다고 즉시 실행되는 것이 아니다.
- OS스케줄러가 실행순서를 결정한다.
public class Ex13_1 {
public static void main(String[] args) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r);
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread{
public void run() {
for(int i = 0; i<5; i++) {
System.out.println(getName());
}
}
}
class ThreadEx1_2 implements Runnable{
@Override
public void run() {
for(int i = 0; i<5; i++) {
// Thread.currentThread(); - 현재 실행중인 Thread를 반환한다.
System.out.println(Thread.currentThread().getName());
}
}
}
- start()와 run()
start()실행 -> 새로운 쓰레드 생성 -> 새로운 쓰레드에 run()을 올림 -> start() 종료
각 각의 쓰레드가 자기만의 호출스택을 가지고 실행한다.
그래서 서로 독립적인 작업을 수행한다.
'JAVA개념' 카테고리의 다른 글
데몬 쓰레드(daemon thread) (0) | 2021.12.06 |
---|---|
싱글 쓰레드, 멀티 쓰레드 (0) | 2021.12.06 |
StringBuffer클래스의 생성자와 메서드 (0) | 2021.12.01 |
StringBuffer의 비교 (0) | 2021.11.30 |
예외처리(exception handling) (0) | 2021.11.30 |