프로세스와 쓰레드
프로세스
- 실행 중인 프로그램
- 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 됨
- 프로그램을 수행하는 데 필요한 데이터와 메모리등의 자원 그리고 쓰레드로 구성
- 최소한 하나 이상의 쓰레드가 존재
- 둘 이상의 쓰레드를 가진 프로세스를 '멀티쓰레드 프로세스'라고 함
쓰레드
- 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것
ex) 쓰레드(일꾼)는 프로세스(공장)에서 작업을 처리한다.
멀티태스킹과 멀티쓰레딩
멀티태스킹
- 여러 개의 프로세스가 동시에 실행되는 것
- 윈도우, 유닉스를 포함한 대부분의 OS가 지원
멀티쓰레딩
- 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것
- 동시에 처리되는 작업의 개수는 코어의 개수와 일치
- 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 동시에 수행되는 것처럼 보임
* CPU의 코어
- 한 번에 단 하나의 작업만 수행 가능
멀티쓰레딩의 장단점
장점
- CPU의 사용률을 향상시킴
- 자원을 보다 효율적으로 사용할 수 있음
- 사용자에 대한 응답성이 향상됨
- 작업이 분리되어 코드가 간결해짐
ex)
메신저로 채팅하면서 파일을 다운로드 받거나 인터넷 서핑이 가능한 이유는 멀티쓰레드로 작성되어 있기 때문
싱글쓰레드로 작성되어 있다면 파일을 다운로드 받는 동아넹는 다른 일(채팅, 서핑..)을 할 수 없음
여러 사용자에게 서비스를 해주는 서버 프로그램의 경우 멀티쓰레드로 작성하는 것이 필수적
하나의 서버 프로세스가 여러 개의 쓰레드를 생성해서 쓰레드와 사용자의 요청이 일대일로 처리되도록 프로그래밍 해야함
단점
- 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 동기화, 교착상태같은 문제 발생가능
쓰레드의 구현과 실행
구현
- 두 가지 방법이 있음
1. Thread클래스를 상속
1
2
3
|
class MyThread extends Thread {
public void run() { /* 작업내용 */ } // Thread클래스의 run()을 오버라이딩해야함
}
|
cs |
2. Runnable인터페이스를 구현
1
2
3
|
class MyThread implements Runnable {
public void run() { /* 작업내용 */ } // Runnable인터페이스의 run()을 구현해야함
}
|
cs |
어느 쪽을 선택해도 별 차이는 없지만 Thread클래스를 상속받으면 다른 클래스를 상속받을 수가 없어서, Runnable인터페이스를 구현하는 방법이 일반적
- Runnable인터페이스를 구현하는 방법은 재사용성이 높고 코드의 일관성을 유지할 수 있기 때문에 보다 더 객체지향적인 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
// Thread클래스를 상속받아 쓰레드 구현
class ThreadEx1_1 extends Thread {
// Thread클래스의 run()재정의
public void run() {
for(int i=0; i<5; i++) {
System.out.println(getName()); // Thread의 getName()메소드
}
}
}
// Runnable인터페이스를 상속받아 쓰레드 구현
class ThreadEx1_2 implements Runnable {
// Runnable인터페이스의 run()구현
public void run() {
for(int i=0; i<5; i++) {
System.out.println(Thread.currentThread().getName()); // 현재 실행중인 쓰레드의 이름 반환
}
}
}
public class ThreadEx1 {
public static void main(String[] args) {
// Thread의 자손클래스의 인스턴스 생성
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2(); // Runnable을 구현한 클래스의 인스턴스를 생성해
Thread t2 = new Thread(r); // Thread클래스의 생성자의 매개변수로 제공해 인스턴스생성
// 쓰레드 실행
t1.start();
t2.start();
}
}
|
cs |
출력
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread클래스를 상속받으면, 자손 클래스에서 조상인 Thread클래스의 메소드를 직접 호출 가능 (6행)
Runnable을 구현하면 Thread클래스의 static메소드인 currenetThread()를 호출해 쓰레드에 대한 참조를 얻어야 호출가능
(16행)
쓰레드 이름을 지정하지 않으면 'Thread-번호'로 정해짐
쓰레드의 실행 - start()
- start()를 호출해야 쓰레드 실행
- start()가 호출되었다고 해서 바로 실행되는 것이 아니라, 일단 실행대기 상태에 있다가 자신의 차례가 되어야 실행
- 한 번 실행이 종료된 쓰레드는 다시 실행 할 수 없음 -> 하나의 쓰레드에 대해 start()가 한 번만 호출 가능
- 한 번 더 수행하려면 새로운 쓰레드를 생성한 다음 start()를 호출해야 함
start()와 run()
1. main메소드에서 쓰레드의 start()호출
2. start()는 새로운 쓰레드를 생성, 쓰레드가 작업하는데 사용될 호출스택을 생성
3. 새로 생성된 호출스택에 run()이 호출되어 쓰레드가 독립된 공간에서 작업을 수행
4. 호출스택이 2개가 됐고 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행
main쓰레드
- main메소드의 작업을 수행
- 프로그램을 실행하면 기본적으로 하나의 쓰레드를 생성하고, 그 쓰레드가 main메소드를 호출해 작업이 수행
싱글쓰레드와 멀티쓰레드
싱글쓰레드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import javax.swing.JOptionPane;
public class ThreadEx6 {
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
for(int i=10; i>0; i--) {
System.out.println(i);
try {
Thread.sleep(1000); // 1초 지연
} catch(Exception e) {}
}
}
}
|
cs |
사용자가 입력을 마치기 전까지 대기 후, 입력받으면 for문 시작
멀티쓰레드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import javax.swing.JOptionPane;
public class ThreadEx7 {
public static void main(String[] args) {
ThreadEx7_1 th1 = new ThreadEx7_1();
th1.start(); // ThreadEx7_1쓰레드 실행
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
// Thread클래스를 상속받아 쓰레드 구현
class ThreadEx7_1 extends Thread {
public void run() { // run() 오버라이딩
for(int i=10; i>0; i--) {
System.out.println(i);
try {
Thread.sleep(1000); // 1초 지연
} catch(Exception e) {}
}
}
}
|
cs |
사용자로부터 입력받는 부분과 for문 실행하는 부분을 두 개의 쓰레드로 나누어 처리
6행에 의해 ThreadEx7_1쓰레드가 실행
입력을 받을때까지 대기하지 않고 for문 시작
'아카이브 > 자바의 정석' 카테고리의 다른 글
13장 쓰레드 20210104 (0) | 2021.01.04 |
---|---|
13장 Thread 20201120 (0) | 2020.11.20 |
12장 지네릭스,열거형,애노테이션 20201116 (0) | 2020.11.16 |
12장 지네릭스,열거형,애노테이션 20201113 (0) | 2020.11.13 |
12장 지네릭스,열거형,애노테이션 20201112 (0) | 2020.11.12 |