- 프로세스 : 실행중인 프로그램, 자원(resource)과 쓰레드로 구성
- 쓰레드 : 프로세스 내에서 실제 작업을 수행.
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
- 프로세스 : 쓰레드 = 공장 : 일꾼
- 싱글 쓰레드 프로세스 = 자원 + 쓰레드
- 멀티 쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드 + 쓰레드 + .... + 쓰레드
- 하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
- 2 프로세스 1 쓰레드 vs 1프로세스 2 쓰레드
- 왼쪽은 싱글쓰레드 프르세스가 2개
- 멀티쓰레드 프로세스가 1개
- 대부분의 프로그램이 멀티쓰레드로 작성되어 있다. 그러나, 멀티 쓰레드 프로그래밍이 장점만 있는 것은 아니다.
- 기아(굶어죽는)문제 : 특정 쓰레드는 실행할 기회를 얻지 못한다.
- 1.Thread 클래스를 상속
class MyThread extends Thread { public void run() { // Thread클래스의 run()을 오버라이딩 /* 작업 내용 */ } }
MyThread t1 = new MyThread(); // 쓰레드의 생성 t1.start(); // 쓰레드의 실행
- 2.Runnable인터페이스를 구현
public interface Runnable { public abstract void run (); }
class MyThread2 extends Runnable { public void run() { // Runnable인터페이스의 추상메서드 run()을 구현 /* 작업 내용 */ } }
Runnable r = new MyTrhead2(); Thread t2 = new Thread(r); // Thread(Runnable r) // Thread t2 = new Trhead(new MyThread2()); t2.start();
- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.
ThreaeEx1_1 t1 = nw TrheadEx1_1(); // 쓰레드 t1을 생성한다. ThreaeEx1_1 t2 = nw TrheadEx1_1(); // 쓰레드 t2를 생성한다. t1.start(); // 쓰레드 t1을 실행시킨다. t2.start(); // 쓰레드 t2를 실행시킨다.
- start()를 했더라도 시작되지 않을 수 있다.
- 먼저 start() 했더라도 먼저 시작되지 않을 수 있다.
- 1.쓰레드 생성 -> 2.쓰레드 실행
- main메서드에서 쓰레드 호출
- 쓰레드 메서드가 새로운 호출스택을 생성
- 새로운 호출스택에 run을 올린 뒤 strat메서드가 종료된다.
- 각각의 쓰레드가 자기만의 호출스택을 가지고 실행을 한다. (서로 독립적인 작업을 수행)
- 반드시 strat()로 호출해야 새로운 스택이 생기고 run이 올라갈 수 있다.