process
- 운영체제에서 현재 실행되고 있는 프로그램
- 하나의 프로세스 안에서 여러개의 흐름이 동작할 수 있는데
이것을 Thread라고 함
Multi Process
Multi Tasking
- 두 개 이상의 프로세스를 실행하여 일을 처리하는 것
Thread
- 프로그램 실행 흐름
- 프로세스 내에서 실행되는 세부 작업 단위
- 하나의 프로세스 내에는 여러 개의 Thread가 존재할 수 있음
- 경량화 프로세스라고도 함
- 두 개 이상의 Thread를 MultiThread라고 함
Thread 특징
- 프로세스에 비해 문맥교환 시간이 적게 걸림
- 동료 Thread와 사용메모리 공유할 수 있음
- Thread간의 통신은 프로세스간의 통신에 비해 시간이 적게 걸림 (=빠름)
- 프로세스에 비해 생성 및 종료 시간이 적게 걸림(=빠름)
single Thread Program
- 기본적으로 하나의 Thread가 실행됨.
- main Thread
Multi Thread Program
- Thread가 2개 이상인 프로그램
- 모든 Thread가 종료되야 프로그램이 종료됨
Thread 만들기
작성방법
방법1. Thread Class 상속
- java.lang.Thread클래스를 상속하는 클래스 만들고,
- Thread가 가지고 있는 run()메서드를 오버라이딩
- Thread를 상속받았기 때문에 Thread임
1. Thread 클래스를 상속한 class의 인스턴스 생성후
2. 이 인스턴스의 start() 메서드 호출
class MyThread1 extends Thread{
@override
public void run(){
...
}
}
MyThread1 th = new MyThread1();
th1.start();
- MyThread1은 Thread를 상속받았기 때문에 Thread 임
방법2. Runnable 구현한 Class
- Runnable 인터페이스 구현
- Runnable 인터페이스가 가지고 있는 run()메서드 오버라이딩
- java는 단일상속이 원칙이라 이미 다른 클래스를 상속받고 있을 때
Thread 클래스 상속받을 수 없음 => Runnable interface 구현
- Thread 를 상속받지 않았기 때문에 바로 start() 메서드 호출할 수 없음
1. Runnable 인터페이스 구현한 class의 인스턴스를 생성하고
2. 이 인스턴스를
3. Thread 객체의 인스턴스를 생성할 때 생성자의 매개변수로 넘겨줌
4. Thread 객체 인스턴스의 start() 메서드 호출
class MyThread2 implements Runnable{
public void run() {
...
}
}
MyThread2 run = new MyThread2();
Thread th2 = new Thread(run);
th2.start();
방법 3. 익명 Class
- 별도의 클래스 만들지 않고
- Runnable 인터페이스를 구현한 익명클래스를
- Thread 인스턴스 생성할 때 매개변수로 넘겨줌
- 매번 정의해야되는게 단점이지만
- 한번만 쓰고 말거라면 굳이 클래스 만들 필요없이 할 수 있음
Thread th3 = new Thread(new Runnable() {
@override
public void run(){
...
}
});
th3.start();
Thread 상태
- NEW : 스레드가 생성되고 아직 start()가 호출되지 않은 상태
- RUNNABLE : 실행 중 또는 실행 가능한 상태
- BLOCKED : 동기화 블럭에 의해 일시정지된 상태
(lock이 풀릴 때까지 기다리는 상태)
- WAITING : 일시정지 상태 (UNRUNNABLE)
TIMED_WAITING : 일시정지 시간이 지정된 경우
- TERMINATED : 스레드의 작업이 종료된 상태
Thread.State state = targerThread.getState();
우선순위
- 어떤 Thread를 우선적으로 처리할지 우선순위 부여
- setPriority(1 ~ 10) : 숫자 클수록 우선순위 높음
- start() 메서드 호출하기 전에 설정
- Thread 클래스의 상수 사용 가능
Thread.MAX_PRIORITY : 최대 우선순위 = 10
Thread.MIN_PRIORITY : 최소 우선순위 = 1
Thread.NORM_PRIORITY : 보통 우선순위 = 5
Thread th = new Thread();
th.setPriority(10);
th.start();
Threae 클래스 상수 사용하는 경우
th.setPriority(Thread.MAX_PRIORITY);
th.start();
Daemon Thread
- 일반스레드의 작업을 돕는 보조적인 역할 수행
- 일반스레드가 모두 종료되면 데몬스레드는 자동 종료
작성방법
- start()메서드 호출 전에 설정
- 스레드객체.setDaemon(true);
- ex. 3초마다 자동 저장하는 스레드