프로세스 : 실행 중인 프로그램, 자원(메모리,cpu)과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
프로세스 : 쓰레드 = 공장 : 일꾼
싱글 쓰레드 프로세스
= 자원 + 쓰레드
멀티 쓰레드 프로세스
= 자원 + 쓰레드 + 쓰레드 + 쓰레드 ... + 쓰레드
"하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다"
대부분의 프로그램이 멀티쓰레드로 작성되어 있따. 그러나, 멀티쓰레드 프로그래밍이 장점만 있는 것은 아니다.
장점
단점
- Thread 클래스를 상속
- 자바는
단일 상속
이기 때문에 다른 클래스를 상속받기 어려워짐class MyThread extends Thread{ public void run(); { // Thread 클래스의 run()을 오버라이딩 /* 작업 내용 */ } }
MyThread1 t1 = new MyThread(); // 쓰레드 생성 t1.start(); // 쓰레드의 실행
- Runnable 인터페이스를 구현 -
better
- 다른 클래스를 상속받을 수 있으므로 유연함
class MyThread2 implements Runnable{ public void run(){ // Runnable 인터페이스의 추상메서드 run()을 구현 /* 작업 내용 */ } }
Runnable r = new MyThread2(); Thread t2 = new Thread(r); // 또는 Thread(Runnable r) run() 메서드의 구현체를 외부에서 매개변수로 받음, 외부에서 제공한 run을 쓰레드의 메소드로 호출 // 또는 Thread t2 = new Thread(new MyThread2()); t2.start();
run()
? 쓰레드가 실행할 작업
Thread 클래스를 상속 받으면 this.getName()~ 이런 식으로 this
이용하여 조상인 Thread의 getName() 호출
Runnable 인터페이스를 구현하면 Thread.curretnThread()를 이용해 현재 실행 중인 쓰레드 정보 받아옴
별도의 쓰레드로 만들어서 각자 작업을 수행하면 작업 순서가 섞임
쓰레드를 생성한 후에
start()
를 호출해야 쓰레드가 작업을 시작한다.
OS 스케줄러
가 실행 순서를 결정해준다.ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1을 생성한다
ThreadEx1_2 t2 = new ThreadEx1_2(); // 쓰레드 t2를 생성한다
t1.start(); // 쓰레드 t1을 실행시킨다
t2.start(); // 쓰레드 t2를 실행시킨다
class ThreadTest{
public static void main(String args[]){
MyThread t1 = new MyThread(); // 쓰레드 생성
t1.start(); // 실행
}
}
class MyThread extends Thread{
public void run(){
...
}
}
반드시 start()를 호출해야 새로운 호출 스택이 생성되고 서로 독립적으로 작업 수행
즉 run()이 아니라 start()를 호출해서 새로운 쓰레드 시작