프로세스
- 운영체제에서 실행 중인 하나의 프로그램(애플리케이션)
- 프로그램이 실행될 때 마다 개별적으로 생성
- 하나의 프로그램(애플리케이션)은 다중 프로세스를 만들기도 함
스레드
- 프로세스 내에서 할당된 자원을 이용해 실제 작업을 수행하는 작업 단위
- 모든 프로세스는 하나 이상의 스레드를 가지며 각각 독립적인 작업 단위를 가짐
- 하나의 스레드는 하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 여러 개의 스레드가 존재한다면 여러 개의 실행 흐름이 생긴다는 의미
메인 스레드
- 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하면서 시작
- 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행
- 코드를 모두 실행하거나 return 문을 만나면 프로그램 실행 종료
멀티 스레드
- 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것
- 자바 프로그램(애플리케이션)은 메인 스레드가 종료되면 프로세스도 종료되지만 멀티 스레드 프로그램(애플리케이션)의 경우 실행 중인 스레드가 하나라도 있다면 프로세스가 종료되지 않는다.
- 멀티 스레드 프로그램(애플리케이션)은 하나의 프로세스 내부에 여러 개의 스레드가 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다.
| 장점 | 단점 |
|---|
| 자원을 보다 효율적으로 사용이 가능하다. | 동기화(Synchronization)에 주의해야 한다. |
| 사용자에 대한 응답성 향상이 향상된다. | 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다. |
| 애플리케이션의 응답성 향상이 향상된다. | 프로그래밍 시 고려해야 할 사항이 많다. |
| 작업이 분리되어 코드가 간결해진다. | |
| CPU 사용률이 향상된다. | |
스레드 생성
- 자바에서 작업 스레드도 객체로 생성.
- 관련된 클래스와 인터페이스를 사용해 작업 스레드 생성
java.lang.Thread 클래스를 상속받아 스레드 생성
- thread 클래스 상속 후 run 메소드를 재정의해서 작업 스레드가 실행할 코드를 작성
public class MyThread extends Thread {
@Override
public void run() {
...
}
}
- 생성된 작업 스레드 객체에서 start() 메소드를 호출하면 작업스레드는 자신의 run( ) 메소드를 실행
public class Application {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
java.lang.Runnable 인터페이스를 구현하여 스레드를 생성
- Thread 클래스로부터 직접 작업 스레드 객체를 생성하려면 Runnable 인터페이스의 구현 객체를 매개값으로 갖는 생성자를 호출해야 한다.
public class MyRunnable implements Runnable {
@Override
public void run() {
...
}
}
- Runnable 인터페이스의 구현 객체를 매개값으로 전달해서 Thread 객체를 생성한다.
- 생성된 작업 스레드 객체에서 start() 메소드를 호출하면 작업 스레드는 자신의 run()메소드를 실행하게 된다.
public class Application {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
- 익명 구현 객체를 통해 Runnable 인터페이스를 직접 구현해서 스레드 생성이 가능하다.
public class Application {
public static void main(String[] args) {
Thread thread = new Thread(new Runable() {
@Override
public void run() {
...
}
});
thread.start();
}
}