남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.
쓰레드를 구현 방법을 알아보기에 앞서 프로세스, 쓰레드가 무엇인지 알아보자.
1. 프로그램 / 프로세스 / 쓰레드
a. 프로그램(Program)
- HDD, SSD와 같은 디스크에 저장된 실행 가능한 파일이다.
b. 프로세스(Process)
- 현재 실행 중인 프로그램이다.
- 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것
- 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 쓰레드 구성된다.
c. 쓰레드(Thread)
- 프로세스 내에서 실제로 작업을 수행하는 주체
- 모든 프로세스는 하나 이상의 쓰레드가 존재하여 작업을 수행한다.
- 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다.
- 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드 수가 결정
d. 멀티 태스킹과 멀티 쓰레딩
- 멀티 태스킹: 동시에 여러 프로세스를 실행시키는 것(OS가 멀티태스킹을 지원)
- 멀티 쓰레딩: 하나의 프로세스 내에 동시에 여러 쓰레드를 실행시키는 것
- 같은 프로세스 내의 쓰레드들은 서로 자원을 공유한다.
2. 멀티 쓰레딩 장단점
a. 장점
- 시스템 자원을 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 각 사용자 요청마다 1:1로 처리되도록 해야한다.(쓰레드를 활용하면 된다.)
- 예를 들어 싱글쓰레드 환경에서 사용자 응답을 받는다면, 사용자 응답을 기다린다고 다른 작업을 할 수 없게 된다.
- 작업이 분리되어 코드가 간결해진다.
b. 단점
- 동기화에 주의해야 한다.
- 동기화란 공유 데이터에 대한 접근 문제를 해결해주는 것
- 교착상태가 발생하지 않도록 주의해야 한다.
- 교착상태(Deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있어 아무것도 완료되지 못하는 상태
- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
3. 쓰레드 구현 방법
Java에서 쓰레드를 구현하는 방법은 2가지이다.
- Runnable 인터페이스를 구현하는 방법
- Thread 클래스를 상속받는 방법
Java에서는 다중상속을 허용하지 않기 때문에 Runnable 인터페이스를 구현하는 방법이 재사용성을 높이고 코드의 일관성을 유지할 수 있다는 점이 장점이다.
a. Thread 클래스 상속하는 방법
public class MyThread extends Thread {
@Override
public void run() {
// 작업 내용
}
}
b. Runnable 인터페이스 구현하는 방법
public class MyThread implements Runnable {
@Override
public void run() {
// 작업 내용
}
}
예제
public class ThreadEx1 {
public static void main(String[] args) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Thread t2 = new Thread(new ThreadEx1_2());
t1.start(); // 한번 종료된 쓰레드는 다시 실행할 수 없다. start() 한번만 호출할 수 있다.
t2.start();
}
}
class ThreadEx1_1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName());
}
}
}
class ThreadEx1_2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
// 쓰레드 이름을 지정하지 않으면 Thread-번호 형식으로 이름이 지정
System.out.println(Thread.currentThread().getName());
}
}
}
실행결과
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
'Programming > Java' 카테고리의 다른 글
[Java] 네트워크 프로그래밍 - 1(IP, URL, URLConnection) (0) | 2023.11.03 |
---|---|
[Java] 람다식(Lambda) (0) | 2023.11.03 |
[Java] 컬렉션 프레임워크와 계층 구조 (0) | 2023.11.03 |
[Java] .java(소스파일) vs. .class(바이트코드파일) vs. .jar (0) | 2023.10.20 |
[Java] try-catch 예외처리 (0) | 2023.10.16 |