프로세스와 쓰레드 (process & thread)
프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 갖고 있음
프로세스 : 쓰레드 = 공장 : 일꾼
하나의 새로운 프로세스 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 좋음
싱글 쓰레드 프로세스
= 자원 + 쓰레드
멀티 쓰레드 프로세스
= 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드

멀티쓰레드의 장단점
장점
1. 자원을 보다 효율적으로 사용 가능
2. 사용자에 대한 응답성(responseness)이 향상됨
3. 작업이 분리되어 코드가 간결해짐
단점
1. 동기화에 주의해야 함
2. 교착상태가 발생하지 않도록 주의해야 함
3. 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 함
쓰레드의 구현
1. Thread 클래스를 상속
자바는 단일 상속이라 1번보다 2번으로 하는게 좋긴 함
class MyThread extends Thread {
public void run() { // Thread클래스의 run()을 오버라이딩
/* 작업내용 */
}
}
MyThread t1 = new MyTread(); // 쓰레드의 생성
t1.start(); // 쓰레드의 실행
2. Runnable 인터페이스를 구현
public interface Runnable {
public abstract void run();
}
class MyThread2 implements Runnable {
public void run() { // Runnable인터페이스의 추상메서드 run()을 구현
/* 작업내용 */
}
}
Runnable r = new MyTread2();
Thread t2 = new Thread(r); // Thread(Runnable r)
// Thread t2 = new Thread(new MyTread2()); // 위의 두줄을 한줄로 쓰면
t2.start();
쓰레드의 실행 - start()
쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작함
ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1 생성
ThreadEx1_1 t2 = new ThreadEx1_1(); // 쓰레드 t2 생성
t1.start(); // 쓰레드 t1 실행
t2.start(); // 쓰레드 t2실행
실행 순서를 결정하는 것은 OS 스케줄러
➔ start()했다고 바로 시작하는 것 아님. 먼저 start() 했다고 먼저 시작하는 것 아님
start() 와 run()

싱글쓰레드 VS 멀티쓰레드

쓰레드의 I/O 블락킹

쓰레드의 우선순위 (priority of thread)
- 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있음
(100%는 아님. 참고용)

쓰레드 그룹
- 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것
- 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 함
- 쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 'main 쓰레드 그룹'에 속함
- 자신을 생성한 쓰레드 (부모 쓰레드)의 그룹과 우선순위를 상속받음
쓰레드 그룹의 메서드

데몬 쓰레드 (daemon thread)
- 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행
- 일반 쓰레드가 모두 종료되면 자동적으로 종료됨
- 가비지 컬렉터, 자동 저장, 화면 자동갱신 등에 사용
- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성함

쓰레드의 상태

쓰레드의 실행제어
- 쓰레드의 실행을 제어할 수 있는 메서드 제공
- 이들을 활용해서 보다 효율적인 프로그램을 작성할 수 있음