프로세스와 쓰레드 (process & thread)
- 프로세스 (공장)
- 실행중인 프로그램
- 자원(resource)과 쓰레드로 구성
- 쓰레드 (일꾼)
- 프로세스 내에서 실제 작업을 수행
- 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있음
- 싱글 쓰레드 프로세스
- 멀티 쓰레드 프로세스
- 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드
- 하나의 새로운 프로세스를 생성하는 것 보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 발생함
멀티쓰레드의 장단점
- 장점
- 시스템 자원을 보다 효율적으로 사용할 수 있음
- 사용자에 대한 응답성이 향상됨
- 작업이 분리되어 코드가 간결해짐
- 단점
- 동기화(synchronization)에 주의해야 함
- 교착상태(dead-lock)가 발생하지 않도록 주의해야 함
- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 함
쓰레드의 구현과 실행
쓰레드의 실행 - start()
- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작
ThreadEx1_1 t1 = new ThreadEx1_1();
ThreadEx1_1 t2 = new ThreadEx1_1();
t1.start()
t3.start()
- t1과 t2중 어느 쓰레드가 먼저 실행되는지 모름
- 쓰레드를 start하면 실행 가능한 상태가 되는 것이지 바로 실행되는 것이 아님
- 어느 쓰레드가 먼저 실행될지는 OS의 스케줄러가 결정
main 쓰레드
- main메서드의 코드를 수행하는 쓰레드
- 쓰레드는 '사용자 쓰레드'와 '데몬 쓰레드' 두 종류가 있음
- 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램이 종료됨
멀티쓰레드
public class imsi2 {
static long startTime = 0;
public static void main(String[] args) {
ThreadEx11_1 th1 = new ThreadEx11_1();
ThreadEx11_2 th2 = new ThreadEx11_2();
th1.start();
th2.start();
startTime = System.currentTimeMillis();
try {
th1.join();
th2.join();
} catch (InterruptedException e) {}
System.out.println();
System.out.println("소요시간 : " + (System.currentTimeMillis() - startTime));
}
}
class ThreadEx11_1 extends Thread {
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print(new String("-"));
}
}
}
class ThreadEx11_2 extends Thread {
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print(new String("|"));
}
}
}
- .join() 메소드는 해당 쓰레드의 작업을 기다리도록 하는 역할 수행
- 출력마다 소요시간과 출력 순서가 다름