- 프로세스(Process) 와 쓰레드(Thread)
- 프로세스(Process)란?
: 프로세스는 CPU에 의해 메모리에 올려져 실행중인 프로그램을 말하고, 자신만의 메모리 공간을 포함한 독립적인 실행 환경을 가지고 있다.
자바 JVM(Java Virtual Machine)은 주로 하나의 프로세스로 실행되며, 동시에 여러 작업을 수행하기 위해서 멀티 쓰레드를 지원하고 있다.
- 쓰레드(Thread)란?
: 프로세스 안에서 실질적으로 작업을 실행하는 단위를 말하며, 자바에서는 JVM(Java Virtual Machine)에 의해 관리된다.
프로세스에는 적어도 한개 이상의 쓰레드가 있고, Main 쓰레드 하나로 시작하여 쓰레드를 추가 생성하면 멀티 쓰레드가 된다.
- 멀티쓰레딩의 장단점
장점
- CPU의 사용률을 향상시킨다.
- 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
단점
- 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하며 작업하기 때문에 동기화나 교착상태와 같은 문제들이 생길 수 있다.
- 쓰레드의 구현
: 쓰레드를 구현하는 방법은
1. Thread 클래스를 상속받는 방법과
2. Runnable 인터페이스를 구현하는 방법이 있다.
Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable 인터페이스를 구현하는 방법이 일반적이다.
1. Thread 클래스 상속
class MyThread extends Thread {
public void run() {
//코드
}
}
→ Thread클래스의 run()을 오버라이딩 하여 public void run(){} 메서드 안에 쓰레드 중 실행할 코드를 적어주면 된다.
2. Runnable 인터페이스 구현
public interface Runnable {
public abstract void run();
}
→ Runnable 인터페이스는 run()만 정의되어 있는 간단한 인터페이스이다.
Runnable 인터페이스를 구현하기 위해 추상메서드인 run()의 몸통 {}을 구현해주면 된다.
- 인스턴스 생성 방법
- Thread 클래스
public class ThreadTest {
public static void main(String[] args) {
Thread1 th1=new Thread(); //3
th1.start(); //4
}
}
class Thread1 extends Thread {
public void run() { //1
System.out.println(this.getName()); //2
}
}
→ ① Thread 클래스를 상속받을 클래스를 정의해주고, ② run()메서드에 오버라이드와 쓰레드 중 실행할 코드를 적어준다. ③ Thread의 객체를 생성하고 ④ 쓰레드를 실행한다.
- Runnable 인터페이스
public class ThreadTest {
public static void main(String[] args) {
Runnable r1=new Thread1();
Thread th1=new Thread(r1);
th1.start();
}
}
class Thread1 implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
→ Runnable 인터페이스를 구현하기 위해서 해야 할 일은 추상메서드인 run()의 몸통{}을 만들어 주는 것이다.
- 쓰레드의 실행 - start()
ThreadEx1_1 t1 = new ThreadEx1_1(); //쓰레드 t1 생성
ThreadEx1_1 t2 = new ThreadEx1_1(); //쓰레드 t2 생성
t1.start(); //쓰레드 t1 실행
t2.start(); //쓰레드 t2 실행
→ 쓰레드를 생성했다고 해서 자동으로 실행되는 것이 아니다. start()를 호출해야 쓰레드가 실행되는데, start()가 호출되었다고 해서 바로 실행되는 것이 아니라 실행대기 상태에 있다가 자신의 차례가 되어야 실행된다.
한가지 더 알아둬야 하는 것은 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다. 즉 하나의 쓰레드에 대해 start()가 한 번만 호출 될 수 있다는 뜻이다. 그래서 만일 쓰레드를 한 번 더 실행해야 한다면 아래와 같이 코드를 써야 한다.
ThreadEx1_1 t1 = new ThreadEx1_1();
t1.start();
t1 = new ThreadEx1_1(); //다시 생성
t1.start();
→ 새로운 쓰레드를 생성한 다음에 start()를 호출해야 한다.
- main쓰레드
: main메서드의 작업을 수행하는 것을 main쓰레드라고 한다.
→ main메서드는 종료되어도 다른 메서드가 실행중이면 종료되지 않는다. 즉, 실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_자료형(데이터 타입) (0) | 2023.02.02 |
---|---|
Java_컴파일 시점 VS 런타임 시점 (0) | 2023.02.02 |
Java_애너테이션·어노테이션(annotation) (0) | 2023.01.25 |
Java_열거형(enum)_열거형의 정의와 사용, 열거형의 조상, 열거형에 멤버 추가 (0) | 2023.01.23 |
Java_제네릭스·지네릭스(2)_제네릭스의 제약, 와일드 카드, 제네릭 메서드, 제네릭 타입의 형변환 (0) | 2023.01.19 |